schemat oklepany
asynchroniczne wolenie jakiejs metody przez delegat z callback, po wykonaniu pracy callback wola event, ktory lapie form
sprawdza InvokeRequired i jesli true wola Invoke, jesli nie robi update gui
w teorii ladnie, pieknie, ale w praktyce...
klasa obslugujaca operacje async wywala z funkcji callback zdarzenie w innym watku niz glowny, lapie je gui i czasem flaga InvokeRequired twierdzi ze nie potrzebny jest invoke, chciaz powinna mowic true
delegate void DownloadingDataDelegate();
void mgr_EndDownloadingData(object sender, EventArgs e)
{
LogMsg("mgr_EndDownloadingData");
EndDownloadingData();
}
void EndDownloadingData()
{
if (this.InvokeRequired)
{
LogMsg("EndDownloadingData Need Invoke");
this.Invoke(new DownloadingDataDelegate(EndDownloadingData));
}
else
{
LogMsg("EndDownloadingData");
... tu leci czasem exception
panelLoadingData.Hide();
}
}
log:
2010-04-30 1026 | thread: 8 | mgr_BeginDownloadingData
2010-04-30 1027 | thread: 7 | mgr_EndDownloadingData
2010-04-30 1027 | thread: 7 | EndDownloadingData
EndDownloadingData RefreshDataSource exception
poprawnie:
2010-04-30 1000 | thread: 7 | mgr_BeginDownloadingData
2010-04-30 1001 | thread: 8 | mgr_EndDownloadingData
2010-04-30 1001 | thread: 8 | EndDownloadingData Need Invoke
2010-04-30 1001 | thread: 1 | EndDownloadingData
jak widac czasem .net zapomina ze invoke jest potrzebny, czemu?
na begin tylko pokazuje jakis krecacy sie obrazek, zeby bylo wiadomo ze cos sie dzieje
klasa obslugujaca async na tick timera odpala operacje async pobierania danych