如何使用TaskCompletionSource将其所创建任务的状态设置为Running
TaskCompletionSource创建的任务设置Running状态的解决方案
TaskCompletionSource(简称TCS)生成的是Promise风格任务,默认没有绑定到实际执行的委托逻辑,所以原生生命周期中不会自动进入
TaskStatus.Running状态,该状态默认仅分配给已经被调度器启动、正在执行委托的常规任务。
解决方案1:调整任务状态检测逻辑(最推荐)
原有仅检测Running状态的规则兼容性不足,你可以修改检测逻辑为:只要任务状态不属于Faulted/Canceled/RanToCompletion三种已结束状态,就判定任务处于执行中,该规则可以同时兼容常规任务和TCS任务的场景,无需修改原有TCS的使用逻辑。
解决方案2:使用.NET 5+ 新增的API手动设置Running状态
如果你使用的是.NET 5及以上版本,TCS已经提供了手动设置Running状态的方法,直接调用即可:
// 初始化TCS var tcs = new TaskCompletionSource<YourResultType>(); // 当你实际的任务逻辑开始执行时,调用该方法将任务设为Running状态 tcs.TrySetRunning(); // 逻辑执行完成后再设置最终状态 if(执行成功) { tcs.SetResult(你的结果); } else if(被取消) { tcs.SetCanceled(); } else { tcs.SetException(异常实例); }
低版本.NET兼容方案
如果你使用的是.NET Framework或者.NET Core 3.1及更低版本,没有TrySetRunning这个API,又无法修改状态检测逻辑,可以自定义任务封装类,额外添加自定义的运行状态标记,替换原有对原生Task.Status的检测逻辑即可,不要为了强制设置状态额外分配线程池资源,避免不必要的性能损耗。
内容的提问来源于stack exchange,提问作者Tobias Knauss
相关产品推荐
相关产品推荐

