【发布时间】:2013-10-28 20:14:44
【问题描述】:
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);
}
Await in lock 是不允许的,所以我可以在必要时使用AsyncLock,但尽量保持简单。此代码是否正确且线程安全?我不确定是否等待 Task.WhenAll(taskArray);可以在锁定之外,我应该使用 AsyncLock 代替吗?
【问题讨论】:
-
如果你的
taskArray真的是一个局部变量,那么你根本不需要锁定任何东西。 -
@Stephen Cleary,taskArray 是本地的,但是 SomeMethod1() 和 SomeMethod2() 改变了很多变量,所以当 TestAwaitTaskArrayAsync() 被同时调用几次时,结果可能会混合。
-
在这种情况下,您可能会使用
ConcurrentExclusiveSchedulerPair和/或 TPL Dataflow 网格找到更好的解决方案。
标签: c# multithreading locking async-await