💡
原文中文,约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选项失效,任务没有在同一线程上执行。
➡️