gpt4 book ai didi

c# - 任务并行库 - Task.Delay() 用法

转载 作者:行者123 更新时间:2023-11-30 19:25:22 26 4
gpt4 key购买 nike

我正在对发生的事情进行一些解释。

//VERSION: Async
private async void DoWorkAsync()
{
Stopwatch stpWatch = new Stopwatch();
_logger.WriteToLog("Doing some work...etc + ThreadID=" + Thread.CurrentThread.ManagedThreadId);
stpWatch.Start();

await Task.Delay(5000);

stpWatch.Stop();
_logger.WriteToLog("Work finished on ThreadID=" + Thread.CurrentThread.ManagedThreadId + " ElapsedTime:" + stpWatch.ElapsedMilliseconds);
}

调用如下:

//loop 10 times
Parallel.For(1, 11, p => DoWorkAsync());

到目前为止一切顺利。任务确实按预期延迟了大约 5 秒。 (尽管 Parallel.For 循环提前完成,正如预期的那样)。

但是,如果我编写上述方法的同步版本:

//VERSION: Synchronous
private void DoWork()
{
Stopwatch stpWatch = new Stopwatch();
_logger.WriteToLog("Doing some work...etc + ThreadID=" + Thread.CurrentThread.ManagedThreadId);
stpWatch.Start();

Task.Delay(5000);

stpWatch.Stop();
_logger.WriteToLog("Work finished on ThreadID=" + Thread.CurrentThread.ManagedThreadId + " ElapsedTime:" + stpWatch.ElapsedMilliseconds);
}

即我删除了 async/await 关键字,并用类似的方式调用

Parallel.For(1, 11, p => DoWork());

,没有像以前那样的 5 秒延迟,任务几乎立即完成(由我的日志文件验证)。

Task.Delay 语句在后一种情况下似乎没有效果,我可以不使用 await 关键字吗?

希望一些 TPL 专家能够解释发生了什么!

最佳答案

The Task.Delay statement seems to have no effect in the latter case, can i not use it without await keyword?

好吧,如果不对结果做一些,就不能使用它。 Task.Delay 只是返回一个稍后将完成的任务。这就是它所做的一切。它本身不会对当前线程“做”任何事情。然后使用 await 安排回调以在该任务完成时执行异步方法的其余部分,并在安排回调后将控制权返回给调用者。

如果您正在寻找 Task.Delay 的同步等价物,那基本上就是 Thread.Sleep

关于c# - 任务并行库 - Task.Delay() 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29094072/

26 4 0
文章推荐: javascript - 使变量在整个 spec.js 文件中可用
文章推荐: c# - 如何调用所有事件处理程序订阅者并获得他们的结果?
文章推荐: c# - 我可以将 List 用作方法中的形式参数吗?