在 Web 客户端调用 WCF 事件期间,我的 WCF 服务器需要在每次调用时启动一个新的异步任务,但延迟超过一分钟。
我当前的解决方案包括 Task.Factory.StartNew(() => DoTask());
,其中 DoTask()
在执行其代码之前调用 await Task.Delay(XXX);
。此 WCF 事件发生在我们的生产环境中,这会导致创建许多线程,并停留一分钟。
我想到的解决方案之一是使用 Task.Delay(XXX).ContinueWith((i) => DoTask());
在此解决方案中,在 DoTask() 开始运行之前不会创建线程,但我看到为 Task.Delay()
调用创建了 2 个任务。< /p>
哪个解决方案更好(或者两者都不是......)创建多个线程或创建多个任务? 谢谢。
答案 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
。
哪个解决方案更好(或者两者都不是......)创建多个线程或创建多个任务?谢谢。
创建多个任务会更好。一个线程需要一个堆栈和其他开销。任务的主要目的是减少对这种开销的需求。