[英]SemaphoreSlim and async/await
这有效:
int _counter;
readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
async void Button_Click(object sender, RoutedEventArgs e)
{
if (_semaphore.Wait(0))
{
Title = $"{ ++_counter}";
await Task.Delay(1000); // simulate work
Title = $"{ --_counter}";
_semaphore.Release();
}
}
第一次单击其他按钮后,将忽略单击,直到工作完成。 Tittle
可以是1
或0
。
这不起作用
void Button_Click(object sender, RoutedEventArgs e)
{
if (_semaphore.Wait(0))
{
Test(); // moving code into separate method
_semaphore.Release();
}
}
async void Test()
{
Title = $"{ ++_counter}";
await Task.Delay(1000); // simulate work
Title = $"{ --_counter}";
}
点击按钮将持续上涨Tittle
于2
, 3
,依此类推。
我究竟做错了什么?
async void
仅在事件处理程序中才有意义。 这是一种特殊的异步方式。 它的意思是“生而忘之”。
您不想触发并忘记Test()
方法。 您要等待它返回。
将您的Test
签名更改为:
// Note that it returns a "Task". A task is an awaitable promise.
async Task Test()
{
//...
}
然后在事件处理程序上等待它:
async void Button_Click(object sender, RoutedEventArgs e)
{
if (_semaphore.Wait(0))
{
await Test(); // moving code into separate method
_semaphore.Release();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.