class TaskTracker
{
private volatile ConcurrentBag<Task> _bag = new();
public async Task WaitAllAvailableAsync()
{
await Task.WhenAll(Interlocked.Exchange(ref _bag, new()));
}
public void AddTask(Task toWait)
{
// should guarantee that the Task will be awaited on at least one WaitAllAvailableAsync call
ConcurrentBag<Task> oldBag, bag = _bag;
do
{
bag.Add(toWait);
oldBag = bag;
} while ((bag = _bag) != oldBag);
}
}
WaitAllAvailableAsync
在计时器上调用。
这里有线程安全问题吗?是否有任何情况下,添加的任务不会在
WaitAllAvailableAsync
调用中等待至少一次(假设无限运行)?
我知道这个类可以用
ConcurrentQueue
重写。但对于这个问题我想知道所提出的方法的缺陷。
是否有任何情况下添加的任务不会在
调用至少一次(假设无限运行)内等待?WaitAllAvailableAsync
不,在任何情况下,添加的任务都不会被
WaitAllAvailableAsync
至少等待一次。代码按原样正确执行其预期目的。