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 데이터 플로우 메쉬로보다 나은 해결책을 찾을 수 있습니다. –