gpt4 book ai didi

c# - SemaphoreSlim 和异步/等待

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:22 26 4
gpt4 key购买 nike

这个有效:

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();
}
}

在第一次点击之后,其他按钮的点击将被忽略,直到工作完成。 标题可以是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}";
}

连续点击按钮,Tittle会上升到23等。

我做错了什么?

最佳答案

async void 仅在事件处理程序中有意义。它是一种特殊类型的异步。它的意思是“发射后忘记”。

您不想触发并忘记 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();
}
}

关于c# - SemaphoreSlim 和异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40239795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com