当我运行此代码时,我得到一个我不理解的异常:“可能不会在继续任务上调用start”。请告诉我我做错了什么。
List<Task> TasksList = new List<Task>();
for (int i = 0; i < ThreadsNumber; i++)
{
int local = i;
var task = new Task<List<string>>(() => PrimeTask(Ratio * local, (local + 1) * Ratio))
.ContinueWith((t) => UpdatePrimesList(t.Result));
TasksList.Add(task);
TasksList[i].Start();
}
Task.WaitAny(TasksList.ToArray());
答案 0 :(得分:7)
此处的问题是,task
并非指的是您正在创建的第一个任务,而是指您使用ContinueWith
创建的任务。
IE中。这个结构:
var task = new Task<..>(...).ContinueWith(...);
将引用ContinueWith
返回的任务。您不再具有对第一项任务的引用。
它与此基本相同:
var task = new SomeObject().SomeMethodReturningAnotherObject();
此处您不再引用SomeObject
,只是对SomeMethodReturningAnotherObject
返回的方法的引用。
而是这样做:
var task = new Task<..>(...);
task.ContinueWith(...);
TaskList.Add(task);
task.Start();
这将正确启动第一个任务,而不是尝试启动延续任务,正如您的异常消息告诉您的那样。