从列表中运行任务

本文关键字:任务 运行 列表 | 更新日期: 2023-09-27 18:16:15

当我运行这段代码时,我得到一个我不理解的异常:"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());

从列表中运行任务

这里的问题是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();

这将正确地启动第一个任务,而不是尝试启动延续任务,因为您的异常消息告诉您。