【发布时间】:2020-07-20 17:35:28
【问题描述】:
我正在使用 Task.Run 运行无限循环的更新。这是代码:
Task.Run( async () => {
while(true){
Thread.Sleep(10000);
checkForUpdates();
}
});
在过去,我曾经为长时间运行的任务编写特殊代码。任务执行的持续时间与 Task.Run 有关系吗?是否内置超时?
【问题讨论】:
-
不要在异步代码中使用
Thread.Sleep。请改用Task.Delay。 -
任务执行的持续时间与 Task.Run 有关系吗?是否有内置超时? 没有,但您可能应该等待它返回的
Task。或者持有可以稍后等待的参考。 -
如果您使用
TaskFactory.StartNew,您可以传递TaskCreationOptions.LongRunning,这将确保创建一个新线程来运行任务,而不是从线程池中获取线程。但是,如果您长时间运行的任务的大部分工作是等待下一个循环,请使用await Task.Delay,您应该可以这样。这就是说 imo 一个计时器或一个以设定间隔发射的可观察者更适合您的需求 -
请澄清您的问题。
checkForUpdates()是做什么的?你能从生产者-消费者模式中受益吗?或者也许是 TPL 数据流?也许 Rx 可以帮助你?