Task.Delay() 没有按预期运行,或者我不明白它应该做什么。我试图了解Task
C# 中的 s 以及如何Thread
在我的实现中替换 s 。
我想做的是这样的:
- 虽然真实
- 打印一行
- 稍等片刻,
- 如果条件满足则退出循环,否则继续循环
我已经用 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()
,一切都会按预期工作,并且我会每秒打印一次。我试过添加async
and await
into ChattyWriter()
,但它不仅没有增加 1 秒的延迟,而且只打印了一行而不是 20 行。
我究竟做错了什么?
可能有助于描述我在做什么:我的项目使用外部 API(RESTful),在我请求一些任务发生后,我需要轮询 API 以检查任务是否已完成。外部任务可以长时间运行:1-15 分钟。所以我在检查完成之间需要一些延迟。并且可能有许多不同的并发进程与多个外部任务一起执行。我了解,如果我Thread.Sleep()
在轮询时使用,同一进程上的其他进程Thread
将无缘无故地被阻塞。