C# 启动延迟任务

C# 启动延迟任务,c#,task,delay,C#,Task,Delay,在web客户端调用WCF事件期间,我的WCF服务器需要在每次调用时启动一个新的异步任务,但延迟超过一分钟 我当前的解决方案包括Task.Factory.StartNew(()=>DoTask())其中DoTask()调用等待任务。延迟(XXX)执行其代码之前。这个WCF事件发生在我们的生产环境中,它会导致创建许多线程,这些线程会被卡住整整一分钟 我想到的解决方案之一是使用Task.Delay(XXX).ContinueWith((I)=>DoTask())在这个解决方案中,在DoTask()开始

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


我当前的解决方案包括
Task.Factory.StartNew(()=>DoTask())其中
DoTask()
调用
等待任务。延迟(XXX)执行其代码之前。这个WCF事件发生在我们的生产环境中,它会导致创建许多线程,这些线程会被卡住整整一分钟

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

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


此事件发生在我们的生产环境中,这会导致创建许多线程,这些线程会被卡住整整一分钟

不应该。启动
DoTask()
需要一个线程池线程,但当它到达
时,等待任务。延迟(XXX)它应该将线程释放回池中。你会有很多任务,但这通常不是问题。这就是
wait
的要点,即它释放使用过的线程来执行任何操作,同时允许它或另一个线程在以后继续执行

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

如果在主线程上运行此操作,
ContinueWith
应使用
TaskScheduler.Current
,从而在主线程上运行
DoTask
。您可以将其更改为
TaskScheduler。默认设置为在线程池中运行。如果可以在主线程上运行
DoTAsk
,则可以使用
wait

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


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

哪个概念中的“更好”?演出资源消耗。。。WCF?您是在做非常慢的响应还是在尝试后台执行?不同的无关解决方案取决于您想要什么。。。或者,如果您实际上是指WCF…“这会导致创建许多线程,这些线程会被卡住整整一分钟”-它不应该这样做。你是怎么观察到的?这可能会导致线程池中启动多个线程,但我不希望任何线程被“卡住”。(无可否认,你为什么要调用StartNew而不是仅仅执行异步方法。)@ShayLin:很难只提供这么少量的信息。如果副本对您没有帮助,请编辑帖子以显示副本。