男孩和女孩,
当我在树视图中选择节点时,我得到了执行此方法(任务).它从数据库中检索数据并放入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); } }
Roel van Ude.. 7
您可以检查线程/任务是否已完成.更改线程创建以使用aTask
_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) {
这将解决您当前的问题.