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 关注
- 124 浏览
添加回答
举报