TryExecuteTask(task) 是不是总是阻塞?
Posted
技术标签:
【中文标题】TryExecuteTask(task) 是不是总是阻塞?【英文标题】:Does TryExecuteTask(task) always block?TryExecuteTask(task) 是否总是阻塞? 【发布时间】:2016-06-26 03:58:48 【问题描述】:我正在编写一个 FIFO 排队线程限制的任务调度程序。
在执行task
时,对TaskScheduler.TryExecuteTask(task)
的调用是否总是阻塞?到目前为止的测试表明情况确实如此,但是我在任何地方都找不到此文档。
在上述电话之后有什么理由打电话给task.Wait()
吗?如果任务以Faulted
状态结束,则执行此操作会导致AggregateException
。
【问题讨论】:
【参考方案1】:对TryExecuteTask
的调用将始终阻塞,它会在您调用函数的调度程序上运行您提供的任务,并在任务成功完成时返回。
如果您希望任务在不同的线程中运行:在this page 上有一个示例,说明如何使用QueueUserWorkItem
通知线程池有工作要执行。当你在那里调用TryExecuteTask
时,一个可用的线程会拾取它并执行任务。
task.Wait()
通常用于将任务传递给调度程序以阻塞直到任务完成。由于您没有在不同的线程中执行任务,因此无论如何代码都会阻塞并调用task.Wait()
将是多余的。
【讨论】:
可读性小问题:在上面的第一句话中,“调度程序”这个词应该是“线程”吗:“它运行您在 [~~调度程序~ 〜线程]你正在调用函数”?以上是关于TryExecuteTask(task) 是不是总是阻塞?的主要内容,如果未能解决你的问题,请参考以下文章
Task.WhenAll(taskList).Wait() 是不是与 Task.WaitAll(taskList) 相同?