2 回答

TA貢獻1808條經驗 獲得超4個贊
_sendTicketCurrent需要是易失性的,否則允許JIT將值緩存在寄存器中,這可能導致無限循環。除此之外,它看起來是線程安全的,除了這是對CPU的巨大浪費(SpinWait完全使用內核)。
另外,做真的沒有意義。無論如何,您都要持有一個線程,因此您可以在當前線程中執行等待。await Task.Run(() => SpinWait.SpinUntil(() => mySendTicket == _sendTicketCurrent))
為了以更優化的方式執行所需的操作,已經提供了一個開箱即用的異步兼容同步基元:SemaphoreSlim。
private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
public async Task SendAsync(string message)
{
if (_ws.State != WebSocketState.Open)
throw new Exception("Connection is not open");
try
{
await _semaphore.WaitAsync().ConfigureAwait(false);
var cancel = new CancellationTokenSource(5000);
var bytes = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message));
await _ws.SendAsync(bytes, WebSocketMessageType.Text, true, cancel.Token).ConfigureAwait(false);
}
finally
{
_semaphore.Release();
}
}
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報