Hallo,
Heb een outlook vsto addin waarin meerdere backgroundworkers worden gebruikt. Heb wat problemen met het correct afsluiten van de backgroundworkers bij het sluiten van een formregion.
Na het sluiten van mijn formregion krijg ik “object reference not set” errors van code die afkomstig is uit de runworkercomplete (Datagrid bestaat niet meer). Ondanks dat ik hier tijdens runworkercomplete op controleer( zie voorbeeld) .
Ik geloof dat dit veroorzaakt wordt doordat CancelAsync(); de backgroundworker thread niet direct afsluit maar enkel een marker zet.
Ik zoek naar een goede manier om bij het sluiten van mijn formregion alle backgroundworkers netjes aftesluiten.
In het Do work event van mijn background worker zet ik de status op cancel als deze geannuleerd wordt.
In de oplossing van Matthew Watson
Uit de onderstaande post:
http://social.msdn.micros...0-4b2c-9363-89c46ec369df/
Zie je dat hij dit probleem heeft weten op te lossen door het sluiten van het form te annuleren en dit pas tijdens run workercompleet uitvoert. Deze oplossing ziet er mooi uit, echter ik heb te maken met een formregion. Hierbij heb je geen onclosing event en kan ik het sluiten hiervan ook niet annuleren.
Ik zag dat sommige mensen thread.sleep(200) gebruikten om backgroundworkers netjes te laten afsluiten. Maar de runworkercomplete zit in de zelfde thread als de sleep thread en wordt dus altijd daarna uitgevoerd. Hierdoor blijven background worker. Is busy en cancelation pending altijd tot het eind op true staan. Mis ik hier iets misschien?
Heeft iemand een suggestie hoe ik mijn formregion netjes kan afsluiten ?
Heb een outlook vsto addin waarin meerdere backgroundworkers worden gebruikt. Heb wat problemen met het correct afsluiten van de backgroundworkers bij het sluiten van een formregion.
Na het sluiten van mijn formregion krijg ik “object reference not set” errors van code die afkomstig is uit de runworkercomplete (Datagrid bestaat niet meer). Ondanks dat ik hier tijdens runworkercomplete op controleer( zie voorbeeld) .
Ik geloof dat dit veroorzaakt wordt doordat CancelAsync(); de backgroundworker thread niet direct afsluit maar enkel een marker zet.
Ik zoek naar een goede manier om bij het sluiten van mijn formregion alle backgroundworkers netjes aftesluiten.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| if(!e.Cancelled) { List<ErpLibrary.Relatie> RLijst = (List<ErpLibrary.Relatie>)e.Result; if (this.InvokeRequired) { BeginInvoke(new MethodInvoker(delegate() { BindRelatie(RLijst); })); } else { BindRelatie(RLijst); } } |
In het Do work event van mijn background worker zet ik de status op cancel als deze geannuleerd wordt.
C#:
1
2
3
4
5
| if (backgroundWorker.CancellationPending) { e.Cancel = true; } |
In de oplossing van Matthew Watson
Uit de onderstaande post:
http://social.msdn.micros...0-4b2c-9363-89c46ec369df/
Zie je dat hij dit probleem heeft weten op te lossen door het sluiten van het form te annuleren en dit pas tijdens run workercompleet uitvoert. Deze oplossing ziet er mooi uit, echter ik heb te maken met een formregion. Hierbij heb je geen onclosing event en kan ik het sluiten hiervan ook niet annuleren.
Ik zag dat sommige mensen thread.sleep(200) gebruikten om backgroundworkers netjes te laten afsluiten. Maar de runworkercomplete zit in de zelfde thread als de sleep thread en wordt dus altijd daarna uitgevoerd. Hierdoor blijven background worker. Is busy en cancelation pending altijd tot het eind op true staan. Mis ik hier iets misschien?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| private void FormRegionReadMail_FormRegionClosed(object sender, System.EventArgs e) { if (backgroundWorkerRelatiePerEmail.IsBusy) { backgroundWorkerRelatiePerEmail.CancelAsync(); } if (backgroundWorkerRelatieZoeken.IsBusy) { backgroundWorkerRelatieZoeken.CancelAsync(); } backgroundWorkerRelatiePerEmail.Dispose(); backgroundWorkerRelatieZoeken.Dispose(); int Teller = 0; while (Teller < 10) { if (!backgroundWorkerRelatieZoeken.CancellationPending && !backgroundWorkerRelatiePerEmail.CancellationPending) { break; } System.Diagnostics.Debug.Write("CancelPending: " + Teller.ToString()); Teller = Teller + 1; Thread.Sleep(100); } } |
Heeft iemand een suggestie hoe ik mijn formregion netjes kan afsluiten ?
[ Voor 6% gewijzigd door Verwijderd op 23-10-2009 14:20 ]