簡體   English   中英

信號量苗條和異步/等待

[英]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可以是10

這不起作用

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}";
}

點擊按鈕將持續上漲Tittle23 ,依此類推。

我究竟做錯了什么?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM