我想要做類似下面的事情 - 基本上我調用異步操作,它將在另一個線程中調用回調,並且我想等待它完成「內聯」。我擔心的是,更改跨線程共享的變量(bar &事件)可能由於存儲在寄存器中而不同步。如果它們是成員變量,我可以將它們標記爲volatile,但volatile不能用於在堆棧上創建的局部變量。我可以使用成員變量,但我認爲它的清潔劑不會讓我的課程保持全部本地化。在線程之間共享局部變量是否安全(通過回調閉包)?
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
注意:除非你做的東西AsyncOperation'和'WaitOne'之間'否則,你可能也運行同步 –
這個問題是相關的:http://stackoverflow.com/questions/6581848/memory-barrier-發電機/ 6932271#6932271 –
@Marc - 好點,但我調用的API本質上是異步的。它基於通過網絡發送到服務器的消息。在AsyncOperaton中設置一條消息,並在有回覆時通知回撥。我大部分時間都是異步使用它,但在這種特殊情況下,我想等待結果。我在WaitOne中包含了一個超時,以防止回覆未到。 – Shane