我正在编写一个库,其中包括基于.Net Tasks的调度功能(不是标准TaskScheduler,IScheduler...).我正在使用TaskCompletionSource,并且Task.Status对于表示底层操作的状态至关重要,包括 TaskStatus.Created即已创建但尚未启动.我知道返回的任务通常应该很热,但对于我手动控制的代理任务,我确实最初想要它们Created.
不幸的是,我的初始状态TaskCompletionSource.Task是WaitingForActivation,即它已经过去了Created.换句话说,TaskCompletionSource支持两种状态,但我需要三种状态:
问题:如何获得Task可手动设置为三种不同状态的信息?即Task.Status可以设置为:
1)Created
2)WaitingForActivation/ WaitingForChildrenToComplete/ WaitingToRun/ Running
3)其中一个RanToCompletion/ Canceled/Faulted
下面的代码可以理解为抱怨类型不匹配.我可以通过改变new Task<TResult>来包装任务new Task<Task<TResult>>,但是要回到Task<TResult>我Unwrap()必须的状态WaitingForActivation,并且解开的任务将具有状态,让我回到原点.
我将有大量的这些,所以阻止一个线程与Wait()每个不是一个选项.
我已经考虑过继承Task和覆盖成员(使用new),但是如果可能的话,给库用户一个实际的Task而不是一个很好DerivedTask,特别是因为我在许多其他地方也提出了常规的任务.
想法?
private TaskCompletionSource<TResult> tcs;
private …Run Code Online (Sandbox Code Playgroud)