【发布时间】:2020-03-11 09:31:19
【问题描述】:
我已经完成了这个单元测试,但我不明白为什么“await Task.Delay()”不等待!
[TestMethod]
public async Task SimpleTest()
{
bool isOK = false;
Task myTask = new Task(async () =>
{
Console.WriteLine("Task.BeforeDelay");
await Task.Delay(1000);
Console.WriteLine("Task.AfterDelay");
isOK = true;
Console.WriteLine("Task.Ended");
});
Console.WriteLine("Main.BeforeStart");
myTask.Start();
Console.WriteLine("Main.AfterStart");
await myTask;
Console.WriteLine("Main.AfterAwait");
Assert.IsTrue(isOK, "OK");
}
这是单元测试的输出:
这怎么可能“等待”不等待,而主线程继续?
【问题讨论】:
-
您想要达到的目标有点不清楚。你能添加你的预期输出吗?
-
测试方法很清楚-isOK 预期为真
-
没有理由创建未开始的任务。任务不是线程,它们使用线程。你想做什么?为什么不在第一个
Console.WriteLine之后使用Task.Run()? -
@Elo 你刚刚描述了线程池。您不需要需要任务池来实现作业队列。您需要一个作业队列,例如 Action
对象 -
@Elo 您尝试做的事情已经在 .NET 中可用,例如通过 ActionBlock 等 TPL 数据流类或较新的 System.Threading.Channels 类。您可以创建一个 ActionBlock 来使用一个或多个并发任务来接收和处理消息。所有块都具有可配置容量的输入缓冲区。 DOP 和容量允许您控制并发、限制请求和实施背压 - 如果排队的消息过多,生产者会等待
标签: c# .net async-await task .net-4.6