gpt4 book ai didi

c# - Task.Delay() 未按预期运行

转载 作者:IT王子 更新时间:2023-10-29 04:45:54 42 4
gpt4 key购买 nike

Task.Delay() 没有按预期运行,或者我不明白它应该做什么。我试图了解 C# 中的 Task 以及如何在我的实现中替换 Thread

我想做的是这样的:

  • 虽然是真的
    • 打印一行
    • 等一下,
    • 如果满足则退出循环,否则继续循环

我已经用 Threads 很好地实现了,但是所有酷 child 都说我应该使用 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(),一切都会按预期进行,并且我会每秒打印一次。我尝试将 asyncawait 添加到 ChattyWriter() 中,但它不仅没有添加 1 秒的延迟,而且只打印了一个行而不是 20。

我做错了什么?

它可能有助于描述我在做什么:我的项目使用外部 API (RESTful),在我请求执行一些任务后,我需要轮询 API 以检查任务是否已完成。外部任务可以长时间运行:1-15 分钟。所以我需要在检查完成之间有一些延迟。并且可能有许多不同的并发进程与多个外部任务一起执行。我明白,如果我在轮询时使用 Thread.Sleep(),则同一 Thread 上的其他进程将无缘无故地被阻止。

最佳答案

Task.Delay 返回一个您必须等待的 Task 对象。否则下面的代码会立即执行。因此,您必须将您的方法声明为 async。然后你可以等待 Task.Delay

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

您必须以某种方式中断您的调用线程。单元测试将终止,后台线程也会终止。但是,如果您从 UI 调用此方法,则 UI 不会被阻止。

通过在异步方法上调用 Wait,您将以死锁告终。参见 here获取更多信息。

关于c# - Task.Delay() 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672638/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com