如何正确使用 LongRunning Task

如何正确使用 LongRunning Task

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

在实现后台任务时,使用Task.Factory.StartNew和LongRunning选项并不能保证任务在同一线程上执行,遇到await时会切换线程。应使用同步方法或在异步方法中使用.Wait()进行同步等待,以确保任务在专用线程上运行。

🎯

关键要点

  • 使用Task.Factory.StartNew和LongRunning选项不能保证任务在同一线程上执行。
  • 遇到await时会切换线程,导致LongRunning失效。
  • Task.Factory.StartNew的LongRunning选项并不意味着任务会一直在同一线程上运行。
  • 错误用法示例中,async方法导致线程ID变化,证明LongRunning失效。
  • 正确用法1:将异步方法改为同步方法,避免线程切换。
  • 正确用法2:在异步方法中使用.Wait()进行同步等待。
  • 总结:LongRunning适用于同步、阻塞型任务,不要直接在StartNew中使用async方法。

延伸问答

为什么使用Task.Factory.StartNew和LongRunning选项不能保证任务在同一线程上执行?

因为遇到await时,任务会从ThreadPool中调度新的线程,导致当前线程被释放。

如何正确使用LongRunning任务以确保在专用线程上运行?

可以将异步方法改为同步方法,或在异步方法中使用.Wait()进行同步等待。

使用async方法时,LongRunning选项会失效的原因是什么?

因为async方法在遇到await时会导致线程切换,从而不再在同一线程上执行。

在什么情况下应该使用TaskCreationOptions.LongRunning?

应在需要执行同步、阻塞型任务时使用LongRunning选项。

如果必须使用异步方法,如何确保LongRunning任务的正确执行?

可以在异步方法中使用.Wait()来进行同步等待,确保任务在专用线程上执行。

错误用法示例中,线程ID变化说明了什么?

这说明LongRunning选项失效,任务没有在同一线程上执行。

➡️

继续阅读