【发布时间】:2015-11-30 07:13:57
【问题描述】:
我们在函数中等待事件发生。但我不认为代码是正确的(它有效,但对我来说它看起来不对!)。
起初,这是我同事写的代码:
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 来做,但这对 Sync Functions 也正确吗?)
我的想法是:
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 并使其异步。
-
我已经这样做了,但是使用代码的公司不使用 Async/Await...
-
这似乎是代码审查的主题问题,但是如果您确实将其发布在那里,请确保发布所有相关代码(没有省略号)否则我们将关闭它作为题外话。
-
我同意这属于 Code Review,但从个人角度来看,我会沿着 async / await 路线走,如果那不可能,那么我会使用 ManualResetEvent 或 AutoResetEvent 来实现这一点而不是带有睡眠线程的while循环。
标签: c# multithreading events task