26

Task.Delay() が期待どおりに動作しないか、それが何をすべきか理解していません。C#の s と、実装で sTaskを置き換える方法について頭を悩ませようとしています。Thread

私がやろうとしていることは、次のようなものです:

  • 真実でありながら
    • 行を印刷する
    • ちょっと待って、
    • 条件が満たされた場合はループを終了し、それ以外の場合はループを続けます

私は Threads でそれをうまく実装しましたが、すべてのクールな子供たちは私が Task を使うべきだと言い、Thread には触れないでください。

だから私はこれを持っているコードのために(無視[Test]- これは物事を試すための便利な方法です)

    [Test]
    public void ChattyTask()
    {
        var chattyTask = new Task(ChattyWriter);
        chattyTask.Start();
        chattyTask.Wait();
    }

    public void ChattyWriter()
    {
        int count = 0;
        while (true)
        {
            var message = String.Format("Chatty Writer number {0}", count);
            Trace.WriteLine(message);
            count++;
            Task.Delay(1000);

            if (count >= 20)
            {
                break;
            }
        }
    }

これを実行すると、予想どおり 20 秒ではなく、ミリ秒でテストが終了します。に置き換えるTask.Delay()Thread.Sleep()、すべてが期待どおりに機能し、1 秒に 1 回印刷されます。に と を追加しようasyncawaitしましChattyWriter()たが、1 秒の遅延が追加されなかっただけでなく、20 行ではなく 1 行しか印刷されませんでした。

私は何を間違っていますか?

おそらく、私が何をしているのかを説明するのに役立つでしょう: 私のプロジェクトは外部 API (RESTful) で動作し、いくつかのタスクを要求した後、API をポーリングしてタスクが完了したかどうかを確認する必要があります。外部タスクは長時間実行される可能性があります: 1 ~ 15 分。そのため、完了を確認する間に遅延が必要です。また、複数の外部タスクで実行される多数の異なる同時プロセスが存在する可能性があります。Thread.Sleep()ポーリング時に使用すると、同じ上の他のプロセスThreadが理由もなくブロックされることを理解しています。

4

3 に答える 3

2

Task.Delay() は実際にタスクを作成するので、それを待つだけです。

これを試して

        public static void ChattyWriter()
    {
        int count = 0;
        while (true)
        {
            var message = String.Format("Chatty Writer number {0}", count);
            Console.WriteLine(message);
            count++;
            var t = Task.Delay(1000);
            t.Wait();

            if (count >= 20)
            {
                break;
            }
        }
    }
于 2013-09-07T11:38:03.587 に答える