我有一个异步方法
private async Task DoSomething(CancellationToken token)
任务列表
private List<Task> workers = new List<Task>();
我必须创建运行该方法的 N 个线程
public void CreateThreads(int n)
{
tokenSource = new CancellationTokenSource();
token = tokenSource.Token;
for (int i = 0; i < n; i++)
{
workers.Add(DoSomething(token));
}
}
但问题是那些必须在给定时间运行
public async Task StartAllWorkers()
{
if (workers.Count > 0)
{
try
{
while (workers.Count > 0)
{
Task finishedWorker = await Task.WhenAny(workers.ToArray());
workers.Remove(finishedWorker);
finishedWorker.Dispose();
}
if (workers.Count == 0)
{
tokenSource = null;
}
}
catch (OperationCanceledException)
{
throw;
}
}
}
但实际上它们在我调用 CreateThreads 方法时运行(在 StartAllWorkers 之前)。我搜索了像我这样的关键字和问题,但找不到任何关于阻止任务运行的信息。我尝试了很多不同的方法,但任何可以完全解决我的问题的方法。例如,将代码从DoSomething
a 移到 aworkers.Add(new Task(async () => { }, token));
会运行StartAllWorkers()
,但线程永远不会真正启动。
还有另一种调用方法tokenSource.Cancel()
。