我們正在等待函數發生事件。但我認爲該規範是不正確的(它有效,但對我來說它看起來錯了!)。正確的等待方式事件
首先,這是代碼我的同事寫道:
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
我已經這樣做了,但使用代碼的公司不使用異步/等待... –