Task.Delay()が期待どおりに動作しないか、まあまあ、私は何をすべきか理解できません。私はTask
をC#で頭に入れようとしています。私の実装ではThread
を置き換える方法を教えています。Task.Delay()が期待どおりに動作しない
私は何をしようとしているが、このようなものです:
- 真
- 印刷しながらライン秒
- 待ち、
- 条件が満たされた場合、終了ループ、そうでなければループを維持する
私はスレッドでうまく実装されているが、クールな子供たちはすべて私がタスクを使用する必要があり、スレッドに触れてはいけないと言います。私はこれを実行すると
[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秒ではない、ミリ秒で終了 -
だから私はこれを持っているコードの(物事を試すために、この単なる便利な方法[Test]
を無視)期待する。 Task.Delay()
をThread.Sleep()
に置き換えると、すべて正常に動作し、1秒に1回プリントアウトします。私はChattyWriter()
にasync
とawait
を追加しようとしているだけでなく、それは1秒の遅延を追加しなかった、それだけの代わりに私が間違っているのは何20
の一行だけを印刷しますか?
おそらく、私のプロジェクトは外部API(RESTful)で動作し、いくつかのタスクを実行するよう要求した後、タスクが完了したかどうかを確認するためにAPIをポーリングする必要があります。外部タスクは長時間実行することができます:1-15分。だから私は完了を確認する間にいくつかの遅延が必要です。そして、複数の外部タスクで実行される多くの異なる並行プロセスが存在する可能性があります。ポーリング時にThread.Sleep()
を使用すると、同じ理由のために同じThread
の他のプロセスがブロックされることを理解しています。
私はこれを試してみました。そして、最初の行だけが印刷され、その直後に完了しました。 – trailmax
おそらく、あなたのメインスレッド(テストルーチン)は動作し続けることができ、プログラムが終了するので、残りの部分は表示されない可能性があります。 UIボタンからスレッドを開始しますか?UIはまだ応答します。 – slfan
+1それは正しい解決策です。 – GolfWolf