c# - 防止任务在运行时再次执行

标签 c# winforms task observablecollection void

男孩和女孩,

我得到了当我在 TreeView 中选择一个节点时执行的方法(任务)。它从数据库中检索数据并放入 ReportControl (Codejock)。

我需要的是防止这个方法(任务)在它仍在运行时被再次执行。

我一直在尝试将 bool 值在开始时设置为 false,在完成时设置为 true 但由于某种原因这不起作用......

代码如下: 执行方法的事件:

private void tvObjects_AfterSelect(object sender, TreeViewEventArgs e)
        {
            try
            {
                tvObjects.PreseveTreeState = true;
                tvObjects.SaveTreeState();

                tvObjects.SelectedNode.BackColor = Color.FromArgb(191, 210, 234);

                AllowPreview = false;
                WordPreviewer.UnloadPreviewHandler();
                viewer1.Image = null;


                rcDocumenten.ClearContent();
                rcEmail.ClearContent();

                var n = e.Node as ExtendedTreeNode;
                tvObjects.CurrentNode = e.Node;
                SelectedObjectNode = n;
                WordPreviewer.FileName = null;
                if (n != null)
                {
                    Document.SetDossierNummer(n.DossierNr);
                }

                var selNode = e.Node as ExtendedTreeNode;

                if (selNode != null && selNode.DossierNode)
                {
                    if (selNode.IsFolder)
                    {
                        DossierNr = Convert.ToInt32(selNode.DossierNr);

                        SelectedObjectNode = selNode;

                        var col = new col();
                        col.CreateCurrentDossierDocumentsList(Convert.ToInt32(selNode.DossierNr.ToString()),
                                                              selNode.Tag.ToString());
                        col.CreateCurrentEmailList(selNode.DossierNr, Convert.ToInt32(selNode.Tag.ToString()));

                        var t =
                            new Thread(
                                () =>
                                rcDocumenten_Populate(Convert.ToInt32(selNode.DossierNr.ToString()),
                                                      selNode.Tag.ToString()));
                        t.Start();


                        var t2 = new Thread(
                            () => rcEmail_Populate(selNode.DossierNr, Convert.ToInt32(selNode.Tag.ToString())));
                        t2.Start();

                        tcDocumenten.SelectedTab = selNode.Text.Contains("Email") ? tpEmail : tpDocumenten;
                    }
                    else
                    {
                        tpDocumenten.Text = @"Documenten (0)";
                        tpEmail.Text = @"Emails (0)";

                        SelectedBestandId = -1;
                        SelectedBestandsNaam = string.Empty;
                        SelectedEmailId = -1;
                        SelectedEmailOnderwerp = string.Empty;
                    }
                }
                else if (selNode != null && selNode.PersonalNode)
                {
                    if (!selNode.IsMedewerker)
                    {
                        var t =
                        new Thread(
                            () => rcDocumenten_PersoonlijkeMappenPopulate(Convert.ToInt32(selNode.Tag.ToString())));
                        t.Start();
                    }
                }
            }
            catch (InvalidOperationException iex)
            {
                MessageBox.Show(iex.ToString());
            }
            catch (Exception ex)
            {
                var dmsEx = new DmsException("Fout tijdens het uitvoeren event AfterSelect tvObjects ", "VDocumenten (tvObjects Event: AfterSelect)", ex);
                ExceptionLogger.LogError(dmsEx);
            }

        }

不应该运行两次的方法:

    public void rcDocumenten_PersoonlijkeMappenPopulate(int personalFolderId)
        {
            try
            {
                AllowPreview = false;
                var oc = new col();
                rcDocumenten.FocusedRow = null;
                oc.CreateCurrentPersoonlijkeDocumentsList(personalFolderId);
                UpdateUI(false);

                if (rcDocumenten.InvokeRequired)
                {
                    rcDocumenten.Invoke((MethodInvoker)delegate
                    {
                        rcDocumenten.Records.DeleteAll();
                        rcDocumenten.Redraw();

                        _gegevensLaden = new GegevensLaden(this);
                        _gegevensLaden.Show();


                        //Documenten uit Database ophalen



                        _gegevensLaden.progressbar.Maximum = col.ListPersoonlijkeDocuments.Count;

                        foreach (var document in col.ListPersoonlijkeDocuments)
                        {
                            var versie = Convert.ToDecimal(document.Versie.ToString());

                            if (document.OriBestandId == 0)
                            {
                                //Record toevoegen
                                rcDocumenten_Persoonlijk_AddRecord(document.BestandId, document.BestandsNaam, versie,
                                                       document.DatumToevoeg, document.DatumUitcheck, document.UitgechecktDoor, document.Eigenaar,
                                                       document.DocumentType, document.DocumentProgres);
                            }


                            _gegevensLaden.progressbar.Value = _gegevensLaden.progressbar.Value + 1;
                            _gegevensLaden.progressbar.Update();
                        }

                        var aantalRecords = 0;
                        for (var i = 0; i < rcDocumenten.Records.Count; i++)
                        {
                            aantalRecords++;

                            for (var j = 0; j < rcDocumenten.Records[i].Childs.Count; j++)
                            {
                                aantalRecords++;
                            }
                        }
                        tpDocumenten.Text = @"Documenten (" + aantalRecords + @")";

                        rcDocumenten.Populate();
                        Invoke(new UpdateUIDelegate(UpdateUI), new object[] { true });
                    });
                }
                //"dd-MM-yyyy HH:mm:ss"
                AllowPreview = true;
            }
            catch (Exception ex)
            {
                var dmsEx = new DmsException("Fout bij de populatie van Report Control", "VDocumenten (rcDocumenten_Persoonlijk_Populate)", ex);
                ExceptionLogger.LogError(dmsEx);
            }
        }

最佳答案

您可以检查线程/任务是否已完成。更改线程创建以使用 Task

_t =
    Task.Factory.StartNew(
        () =>
        rcDocumenten_Populate(Convert.ToInt32(selNode.DossierNr.ToString()),
                              selNode.Tag.ToString()));

然后您可以将 Task 保留在类范围内。正如您在上面看到的,我将其命名为 _t

private Task _t; // documenten vullen achtergrond thread

现在,不要盲目地启动 Task,而是检查 Task 是否应该启动。

if (_t == null || _t.IsCompleted) {

这将解决您当前的问题。

关于c# - 防止任务在运行时再次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495595/

相关文章:

c# - 代码隐藏是否比内联代码更快?

C#/.NET Timers 和 Win32 Sleep 函数都不准确

c# - 使用异步等待或任务?

c# - 当 ThreadPool 中的事件线程数大于 ThreadPool.GetMinThreads() 时启动任务

c# - 有没有一种方便的方法可以将所有接口(interface)方法映射到一个子对象上?

c# - Tls 1.2 或 Tls 1.0 与 .net 框架 4.0

c# - 是否在基于 dotNET Core 的 Linux、Mac 等上运行通用 Windows 平台 (UWP)?

c# - 在设计时设置 ComboBox 的 Text 和 Value 属性

c# - 为什么要使用 Windows.Forms.Timer?

java - Gradle 任务依赖于一个不应该存在的文件