2012-10-05 11 views
5

Jak niedawno odkryłem na mój koszt, robienie await, gdy nie ma kontekstu synchronizacji, może spowodować kod po oczekiwaniu na wykonanie w innym wątku.Jak mogę uzyskać kontynuację po oczekiwaniu na wykonanie w tym samym wątku?

Mam obecnie problemy z dziwnym zachowaniem w dodatku do VSTO, co moim zdaniem jest prawdopodobnie wynikiem tego zachowania Podczas przetwarzania zdarzeń wywoływanych przez aplikację Office nie istnieje kontekst synchronizacji (chyba że utworzę formularz, który utworzy kontekst synchronizacji).

Moje pytanie dotyczy tego, czy tworzenie formularza jest najlepszym/najskuteczniejszym sposobem zapewnienia, że ​​mam kontekst synchronizacji, lub czy jest prostszy sposób to zrobić.

+0

Czy nie byłoby łatwiej nie używać słowa "czekam na" w tym przypadku? Jeśli używany interfejs API jest tylko asynchroniczny, możesz to osiągnąć, używając 'Task'' 'Result' lub' Wait() '. – svick

+0

@svick: Domyślam się, że jeśli chcę poczekać na tę samą nitkę, to jest to zachowanie "synchroniczne". Hmmm ... tak, myślę, że tak. *Westchnienie*. Jestem trochę zagubiony w tych rzeczach, szczerze mówiąc. –

Odpowiedz

5

Aplikacje biurowe wywołują ich zdarzenia w kontekście STA, ale nie zapewniają odpowiedniego SynchronizationContext.

Najprostszym sposobem obejścia tego problemu jest wyjaśnienie na moim blogu pod numerem SynchronizationContext Odds and Ends, w którym krótko opiszę kilka różnych rzeczy, które znalazłem podczas badania mojego artykułu, ale nie były one na tyle ważne, aby je uwzględnić. Aby rozwiązać ten problem, na początku każdego zdarzenia, to zrobić:

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext()); 

Wszelkie await s po które powinny powrócić na wątku STA.

+0

Uwaga dla każdego, kto myśli o tym - patrz również http://stackoverflow.com/q/12898569/98422 –

3

Być może warto wypróbować wersję this article, która opisuje sposób konfigurowania kontekstu synchronizacji bez użycia pompy komunikatów. Zauważ, że jest to przydatne tylko wtedy, gdy spodziewasz się innej pracy, którą masz zamiar czekać (kolejkowanie wielu wywołań zwrotnych). Jeśli będziesz tylko czekał na jedną rzecz naraz, Twój kod może równie dobrze działać synchronicznie, ponieważ nie masz t mieć coś innego do zrobienia z czasem bezczynności, np. uruchomić pompę wiadomości.

Powiązane problemy