Chcę zrobić coś takiego jak poniżej: zasadniczo wywołuję operację asynchroniczną, która wywoła wywołanie zwrotne w innym wątku i chcę poczekać, aż zakończy "inline". Obawiam się, że zmiany zmiennych udostępnianych w wątkach (zdarzenie bar &) mogą nie być synchronizowane, na przykład z powodu przechowywania w rejestrach. Jeśli były to zmienne składowe, mogłem oznaczyć je jako zmienne, ale zmienne nie mogą być używane w zmiennych lokalnych tworzonych na stosie. Mógłbym używać zmiennych członkowskich, ale myślę, że jego czystsze nie zaśmiecać mojej klasy, utrzymując to wszystko lokalne.Czy można bezpiecznie udostępniać zmienne lokalne między wątkami (przez zamknięcie wywołania zwrotnego)?
Bar bar = null;
ManualResetEvent event = new ManualResetEvent(false);
foo.AsyncOperation(new Action(()=>{
// This delegate will be called in another thread
bar = ...
event.Set();
}));
event.WaitOne(timeout);
// use bar
Uwaga: chyba zrobić coś innego między 'AsyncOperation' i' WaitOne', równie dobrze można go uruchomić synchronicznie –
To pytanie jest związane: http://stackoverflow.com/questions/6581848/memory-barrier- generators/6932271 # 6932271 –
@Marc - Dobry punkt, ale API nazywam z natury asynchroniczny. Jest oparty na wiadomościach przesyłanych przez sieć do serwera. W ramach AsyncOperaton ustawiona jest wiadomość, a oddzwonienie jest powiadamiane, gdy pojawia się odpowiedź. Używam go asynchronicznie przez większość czasu, ale w tym konkretnym przypadku chcę poczekać na wynik. Wrzucam do WaitOne czas na wypadek, gdyby odpowiedź nie nadeszła. – Shane