【发布时间】:2011-11-09 02:21:51
【问题描述】:
我想做类似以下的事情 - 基本上我正在调用一个异步操作,它将在另一个线程中调用回调,我想等待它完成“内联”。我担心的是,跨线程(栏和事件)共享的更改变量可能由于存储在寄存器中而无法同步。如果它们是成员变量,我可以将它们标记为 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之间做其他事情,否则你最好同步运行它 -
@Marc - 好点,但我调用的 API 本质上是异步的。它基于通过网络发送到服务器的消息。在 AsyncOperaton 中设置了一条消息,并在有回复时通知回调。我大部分时间都是异步使用它,但在这种特殊情况下,我想等待结果。我在 WaitOne 中包含一个超时,以防没有回复。
-
@Shane cool - 在这种情况下使用很好;但是,您可能会惊讶于我看到人们(立即)不恰当地执行异步/连接的次数。
标签: c# .net multithreading concurrency