【发布时间】:2013-09-07 11:05:24
【问题描述】:
Task.Delay() 没有按预期运行,或者我不明白它应该做什么。我正在尝试了解 C# 中的 Tasks 以及如何在我的实现中替换 Threads。
我想做的是这样的:
- 虽然是真的
- 打印一行
- 等一下,
- 如果条件满足则退出循环,否则继续循环
我已经用 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 和await 添加到ChattyWriter() 中,但它不仅没有增加1 秒的延迟,而且只打印了一行而不是20 行。
我做错了什么?
这可能有助于描述我在做什么:我的项目使用外部 API (RESTful),在我请求一些任务发生后,我需要轮询 API 以检查任务是否已完成。外部任务可以长时间运行:1-15 分钟。所以我需要在检查完成之间有一些延迟。并且可能有许多不同的并发进程与多个外部任务一起执行。我明白,如果我在轮询时使用Thread.Sleep(),同一Thread 上的其他进程将无缘无故地被阻塞。
【问题讨论】:
标签: c# multithreading task-parallel-library