1

このコードを実行すると、理解できない例外が発生します。「継続タスクで 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());
4

1 に答える 1

7

ここでの問題は、task作成している最初のタスクではなく、 で作成したタスクを参照していることですContinueWith

すなわち。この構造:

var task = new Task<..>(...).ContinueWith(...);

返されるタスクを参照しContinueWithます。最初のタスクへの参照がなくなりました。

基本的にはこれと同じです:

var task = new SomeObject().SomeMethodReturningAnotherObject();

ここでは、 への参照はもうありません。SomeObjectメソッドSomeMethodReturningAnotherObjectが返すものへの参照だけです。

代わりにこれを行います:

var task = new Task<..>(...);
task.ContinueWith(...);
TaskList.Add(task);
task.Start();

例外メッセージが示すように、これにより最初のタスクが正しく開始され、継続タスクは開始されません。

于 2013-05-31T21:59:55.737 に答える