C# 启动延迟任务
在web客户端调用WCF事件期间,我的WCF服务器需要在每次调用时启动一个新的异步任务,但延迟超过一分钟C# 启动延迟任务,c#,task,delay,C#,Task,Delay,在web客户端调用WCF事件期间,我的WCF服务器需要在每次调用时启动一个新的异步任务,但延迟超过一分钟 我当前的解决方案包括Task.Factory.StartNew(()=>DoTask())其中DoTask()调用等待任务。延迟(XXX)执行其代码之前。这个WCF事件发生在我们的生产环境中,它会导致创建许多线程,这些线程会被卡住整整一分钟 我想到的解决方案之一是使用Task.Delay(XXX).ContinueWith((I)=>DoTask())在这个解决方案中,在DoTask()开始
我当前的解决方案包括
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:很难只提供这么少量的信息。如果副本对您没有帮助,请编辑帖子以显示副本。