gpt4 book ai didi

c# - 等待锁定执行的任务数组

转载 作者:行者123 更新时间:2023-11-30 20:01:08 25 4
gpt4 key购买 nike

可以从代码中的多个位置调用 TestAwaitTaskArrayAsync()。我需要锁定 taskArray 的执行并异步等待直到它的所有任务完成,然后下一次调用才会开始执行 taskArray。这是代码:

private async Task TestAwaitTaskArrayAsync()
{
Task[] taskArray;
lock (_lock_taskArray)
{
taskArray = new Task[]
{
Task.Run(() =>
{
SomeMethod1();
}),
Task.Run(() =>
{
SomeMethod2();
})
};
}
await Task.WhenAll(taskArray);
}

不允许在锁中等待,所以我可以使用 AsyncLock如有必要,但尽量保持简单。此代码是否正确且线程安全?我不确定是否 await Task.WhenAll(taskArray);可以在锁之外,我应该改用 AsyncLock 吗?

最佳答案

您使用的锁几乎没有效果,因为创建任务非常快并且不会与任何东西发生冲突。在异步设置中实现互斥的方法是使用 SemaphoreSlim 类。它是一个支持任务异步模式的锁。

    SemaphoreSlim sem = new SemaphoreSlim(1);
private async Task TestAwaitTaskArrayAsync()
{
await sem.WaitAsync();
try {
Task[] taskArray = new Task[]
{
Task.Run(() =>
{
SomeMethod1();
}),
Task.Run(() =>
{
SomeMethod2();
})
};
}
await Task.WhenAll(taskArray);
}
finally { sem.Release(); }
}

以同步方式这会更容易:

lock (_lock_taskArray)
Parallel.Invoke(() => SomeMethod1(), () => SomeMethod2());

完成。

如果您愿意,也可以使用 AsyncLock。这应该允许您使用 using 结构来可靠地释放锁。

关于c# - 等待锁定执行的任务数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475858/

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