我们正在等待函数发生事件。但我认为该规范是不正确的(它有效,但对我来说它看起来错了!)。正确的等待方式事件
首先,这是代码我的同事写道:
public string Dispatch(Request data)
{
var uri = ...
string _result = null;
using (var ws = new WebSocket(uri))
{
ws.OnMessage += (sender, e) =>
{
_result = e.Data;
};
ws.Send(request);
while (_result == null)
{
Thread.Sleep(10);
}
return _result;
}
}
有没有意识到这更好的办法?我想我可以使用AutoResetEvent,但这是否更好?有没有一种方法可以实现代码,以便线程可以在等待答案时重用? (我知道如何与TaskCompletitionSource做到这一点,但是这也是正确的同步功能?)
我的想法是:
public string Dispatch(Request data)
{
var uri = ...
using (var ws = new WebSocket(uri))
{
TaskCompletionSource<Guid> tcs;
ws.OnMessage += (sender, e) =>
{
tcs.SetResult(e.Data);
};
ws.Send(request);
return tcs.Task.Result;
}
}
或
public string Dispatch(Request data)
{
var uri = ...
string _result = null;
var event = new AutoResetEvent(false);
using (var ws = new WebSocket(uri))
{
TaskCompletionSource<Guid> tcs;
ws.OnMessage += (sender, e) =>
{
_result = e.Data;
event.Set();
};
ws.Send(request);
event.WaitOne();
return _result;
}
}
使用TCS进行异步处理。 – i3arnon
_ [我可以在Stack Overflow上发布关于优化代码的问题吗?....不,它不是最好的地方 - 虽然它是关于主题的,但是对于这样的问题有更好的地方。您可以将代码复制到Code Review中 - 但请确保阅读他们的帮助中心,查看他们对一个好问题的期望。](http://meta.stackoverflow.com/questions/261841/can-i-post - 关于优化代码堆栈溢出)_ – MickyD
我已经这样做了,但使用代码的公司不使用异步/等待... –