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,而是試圖保持簡單。這段代碼是否正確並且線程安全?我不確定是否等待Task.WhenAll(taskArray);可以在鎖之外,我應該使用AsyncLock來代替嗎?
如果你的'taskArray'實際上是一個局部變量,那麼你根本不需要鎖定任何東西。 –
@Stephen Cleary,taskArray是本地的,但SomeMethod1()和SomeMethod2()更改很多變量,所以當同時調用TestAwaitTaskArrayAsync()幾次時,結果可以混合。 – as74
在這種情況下,您可以使用'ConcurrentExclusiveSchedulerPair'和/或TPL Dataflow網格找到更好的解決方案。 –