gpt4 book ai didi

c# - 多个线程是否以 FIFO 顺序恢复对同一个任务的等待?

转载 作者:太空狗 更新时间:2023-10-30 01:01:42 26 4
gpt4 key购买 nike

假设一个 Task从单个线程创建并 await 多次。恢复顺序是FIFO吗?

简单示例:Debug.Assert() 真的是不变量吗?

Task _longRunningTask;

async void ButtonStartSomething_Click()
{
// Wait for any previous runs to complete before starting the next
if (_longRunningTask != null) await _longRunningTask;

// Check our invariant
Debug.Assert(_longRunningTask == null, "This assumes awaits resume in FIFO order");

// Initialize
_longRunningTask = Task.Delay(10000);

// Yield and wait for completion
await _longRunningTask;

// Clean up
_longRunningTask = null;
}
为了简单起见,

InitializeClean up 保持在最低限度,但一般想法是,在下一次 Initialize 运行之前,之前的Clean up 必须完成 .

最佳答案

简短的回答是:不,不能保证。

此外,you should not use ContinueWith ;在其他问题中,它有一个令人困惑的默认调度程序(我的博客上有更多详细信息)。您应该改用 await:

private async void ButtonStartSomething_Click()
{
// Wait for any previous runs to complete before starting the next
if (_longRunningTask != null) await _longRunningTask;
_longRunningTask = LongRunningTaskAsync();
await _longRunningTask;
}

private async Task LongRunningTaskAsync()
{
// Initialize
await Task.Delay(10000);

// Clean up
_longRunningTask = null;
}

请注意,如果在任务仍在运行时可以多次单击按钮,这仍然可能具有“有趣”的语义。

防止 UI 应用程序多次执行问题的标准方法是禁用按钮:

private async void ButtonStartSomething_Click()
{
ButtonStartSomething.Enabled = false;
await LongRunningTaskAsync();
ButtonStartSomething.Enabled = true;
}

private async Task LongRunningTaskAsync()
{
// Initialize
await Task.Delay(10000);
// Clean up
}

这会强制您的用户进入一次一个操作的队列。

关于c# - 多个线程是否以 FIFO 顺序恢复对同一个任务的等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37450760/

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