我试图同步异步调用.
常规(异步)流程如下所示:
>使用telnet向服务器请求数据:’Session.sendToTarget(message)’
>该应用程序继续做其他事情….
>当服务器应答就绪时,服务器发送结果.
>应用程序获取结果并引发事件“OnDataReceived”
来自服务器的数据对于下一步至关重要,所以我希望保持一切直到收到它为止.
同步流应如下所示:
>向服务器请求数据:Session.sendToTarget(message)
>等到从服务器收到数据
使用c#,我试图将操作与’WaitHandle.WaitOne(TimeToWaitForCallback)’同步失败,似乎WaitOne停止了接收传入消息的应用程序(我试过等待其他的thred). Afther TimeToWaitForCallback时间传递我得到了停止deu到WaitOne操作的传入消息.
我尝试使代码同步:
public virtual TReturn Execute(string message)
{
WaitHandle = new ManualResetEvent(false);
var action = new Action(() =>
{
BeginOpertaion(message);
WaitHandle.WaitOne(TimeToWaitForCallback);
if (!IsOpertaionDone)
OnOpertaionTimeout();
});
action.DynamicInvoke(null);
return ReturnValue;
}
传入此代码:
protecte protected void EndOperation(TReturn returnValue)
{
ReturnValue = returnValue;
IsOpertaionDone = true;
WaitHandle.Set();
}
有任何想法吗?
最佳答案
AutoResetEvent mutex = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
Thread.Sleep(2000);
Console.WriteLine("sleep over");
mutex.Set();
}));
mutex.WaitOne();
Console.WriteLine("done");
Console.ReadKey();
当异步操作完成时,将mutex.Set()放到你的事件处理程序中…
ps:我喜欢线程动作符号:P