4

コンソールMainアプリケーションのメソッド:

Do().ContinueWith(t => Do())
    .ContinueWith(t => Do())
    .ContinueWith(t => Do());

Doを返すメソッドですTask:

var source = new CancellationTokenSource();
var token = source.Token;
return Task.Factory.StartNew(() =>
{
    Console.WriteLine("Inside " + _Counter);
    token.WaitHandle.WaitOne(1000);
    Console.WriteLine(_Counter++ + " is done");
}, token);

And_Counterは整数フィールドです。

private static int _Counter = 1;

実行すると、結果は次のようになります。

中 1
1 完了
中 2
中 2
中 2
2 完了
3 完了
4 完了

それで、私がTask呼ばれるtAction<Task>呼ばれるaを持っているとしましょう。
を呼び出すとt.ContinueWith(a)tが完了した後にaを呼び出す必要がありますよね? aが実行されると、デリゲートtの呼び出しが終了したことを意味します。

この結果の原因は何ですか? 私はここで何か明らかなことを得ていませんか?
私が使用するもの:

  • ウィンドウズ 8 RTM
  • .NET フレームワーク 4.5
4

1 に答える 1

7

t.ContinueWith(a) を呼び出すと、t が完了した後に a を呼び出す必要がありますよね?

もちろん。ただし、Do関数は新しいタスクを作成するため、すぐに完了し、次のDo. タスクの作成を削除してDo(Console.WriteLine のみを残して)、期待どおりに動作するはずです。

    static void Do()
    {
        Console.WriteLine("Inside " + _Counter);
        Thread.Sleep(1000);
        Console.WriteLine(_Counter + " is done");
    }

    static void Main(string[] args)
    {
        Task.Factory.StartNew(Do)
            .ContinueWith(t => Do())
            .ContinueWith(t => Do())
            .ContinueWith(t => Do());
    }
于 2012-09-01T08:09:12.203 に答える