Szukałem prawie wszędzie w Internecie, a ja googlowałem wiele razy i znalazłem tak wiele wyników, ale wciąż nie mogę znaleźć rozwiązania mojego problemu.Jak prawidłowo używać Dispatcher.BeginInvoke?
Jestem zajęty konwersją starej aplikacji WinForms
do nowej aplikacji WPF, ale mam problem z niektórymi poleceniami. W aplikacji WinForm używają one Control.BeginInvoke()
i przechowują ją w obiekcie IAsyncResult. Czytałem, że Dispatcher.BeginInvoke()
WPF
jest równoznaczne z Control.BeginInvoke()
dla WinForms
ale otrzymuję ten błąd, gdy używam
Dispatcher.BeginInvoke(): „Nie można niejawnie przekonwertować typu «System.Windows.Threading.DispatcherOperation» do "System.IAsyncResult". Konieczna jest jawna konwersja (czy brakuje Ci obsady?) ".
Każda pomoc zostanie doceniona.
Oto kod, który próbuję przekonwertować. To jest oryginalny kod WinForms
. Jestem w stanie przekonwertować wszystko z wyjątkiem części BeginInvoke.
Poniżej znajduje się mój kod, który przekonwertowałem do tej pory, w tym część BeginInvoke, z którą walczę.
private void MessageFilter_AddRemove_Invoked(bool addFilter, System.Windows.Forms.IMessageFilter filter)
{
if (addFilter)
{
System.Windows.Forms.Application.AddMessageFilter(filter);
}
else
{
System.Windows.Forms.Application.RemoveMessageFilter(filter);
}
}
private void MessageFilter_AddRemove(bool addFilter, System.Windows.Forms.IMessageFilter filter)
{
{
IAsyncResult sr = System.Windows.Threading.Dispatcher.BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, addFilter, filter);
sr.AsyncWaitHandle.WaitOne(2000);
}
}
Jeśli wystąpią inne błędy, proszę dać mi znać.
Dzięki
Czy możesz wpisać kod, który próbujesz przekonwertować? Wygląda na to, że używasz zwracanej wartości 'Control.BeginInvoke' w oryginale, ale nie widząc, jak trudno jest skomentować odpowiednią zmianę. –
Odpowiedź Michaela jest dobra - ale warto również zauważyć, że wiersz 'sr.AsyncWaitHandle.WaitOne (2000)' po prostu zatrzymuje bieżący wątek na 2 sekundy, i wydaje się, że jest zbędny (przynajmniej mam nadzieję, że * jest zbędny ...). Jeśli usuniesz ten wiersz, w ogóle nie potrzebujesz wartości zwracanej (tylko wywołanie zwrotne). –
Tak, odpowiedź Michaela jest dobra, ale nadal mam problem z jedną małą częścią. Muszę użyć niestandardowego interfejsu API do wywołania zwrotnego. Jest to część, w której przypisują BeginInvoke() do obiektu IAsyncResult. Próbowałem kilka sposobów, aby uzyskać prawidłowy kod, aby mógł on wykonywać swoją funkcję, ale staram się to naprawić. – GANDA1F