防止任务在仍在运行时再次执行

时间:2013-12-10 13:15:28

标签: c# winforms task observablecollection void

男孩和女孩,

当我在树视图中选择节点时,我得到了执行此方法(任务)。它从数据库中检索数据并放入ReportControl(Codejock)。

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

我一直在尝试在开始时设置为假的布尔值,如果完成则设置为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);
            }
        }

1 个答案:

答案 0 :(得分:7)

您可以检查线程/任务是否已完成。更改线程创建以使用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) {

这将解决您当前的问题。