WinForms, Invoke, InvokeRequired

0

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

0

metody wywoływane asynchronicznie zawsze działają w osobnym wątku więc jest w ogóle sens w tej sytuacji robić dwie wersje na InvokeRequired i NotRequired? Przecież wiadomo że nie jesteśmy w wątku GUI. Imo wołaj za każdym razem dla danej kontrolki Invoke.

Gdy uchwyty do kontrolek nie zostały stworzone, (np okienko się jeszcze nie pojawiło), lub kontrolka jest ukryta (ale tutaj nie dam głowy) to InvokeRequired może źle wskazywać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1