启动延迟任务

时间:2021-02-02 07:38:22

标签: c# task delay

在 Web 客户端调用 WCF 事件期间,我的 WCF 服务器需要在每次调用时启动一个新的异步任务,但延迟超过一分钟。

我当前的解决方案包括 Task.Factory.StartNew(() => DoTask());,其中 DoTask() 在执行其代码之前调用 await Task.Delay(XXX);。此 WCF 事件发生在我们的生产环境中,这会导致创建许多线程,并停留一分钟。

我想到的解决方案之一是使用 Task.Delay(XXX).ContinueWith((i) => DoTask()); 在此解决方案中,在 DoTask() 开始运行之前不会创建线程,但我看到为 Task.Delay() 调用创建了 2 个任务。< /p>

哪个解决方案更好(或者两者都不是......)创建多个线程或创建多个任务? 谢谢。

1 个答案:

答案 0 :(得分:0)

<块引用>

此事件发生在我们的生产环境中,这会导致创建许多线程,并停留一分钟。

不应该。它需要一个线程池线程来启动 DoTask(),但是当它到达 await Task.Delay(XXX); 时,它应该将线程释放回池中。您将有大量任务,但这通常不是问题。这就是 await 的重点,它释放已使用的线程以执行任何操作,同时允许它或另一个线程在稍后恢复执行。

<块引用>

我想到的解决方案之一是使用 Task.Delay(XXX).ContinueWith((i) => DoTask());在此解决方案中,在 DoTask() 开始运行之前不会创建线程,但我看到为 Task.Delay() 调用创建了 2 个任务。

如果您在主线程上运行它,ContinueWith 应该使用 TaskScheduler.Current 并因此在主线程上运行 DoTask。您可以将其更改为 TaskScheduler.Default 以在线程池中运行。如果可以在主线程上运行 DoTAsk,那么您可以使用 await

<块引用>

哪个解决方案更好(或者两者都不是......)创建多个线程或创建多个任务?谢谢。

创建多个任务会更好。一个线程需要一个堆栈和其他开销。任务的主要目的是减少对这种开销的需求。