从列表中运行任务

Tal*_*aki 1 c# task

当我运行此代码时,我得到一个我不理解的异常:"可能不会在继续任务上调用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());
Run Code Online (Sandbox Code Playgroud)

ang*_*son 7

这里的问题是,这task并不是指您正在创建的第一个任务,而是指您创建的任务ContinueWith.

IE浏览器.这种结构:

var task = new Task<..>(...).ContinueWith(...);
Run Code Online (Sandbox Code Playgroud)

将引用ContinueWith返回的任务.您不再具有对第一个任务的引用.

它与此基本相同:

var task = new SomeObject().SomeMethodReturningAnotherObject();
Run Code Online (Sandbox Code Playgroud)

在这里你不再有引用SomeObject,只是对方法SomeMethodReturningAnotherObject返回的引用.

而是这样做:

var task = new Task<..>(...);
task.ContinueWith(...);
TaskList.Add(task);
task.Start();
Run Code Online (Sandbox Code Playgroud)

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