[英]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.