繁体   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