小编Kri*_*erg的帖子

创建冰冷的TaskCompletionSource?

我正在编写一个库,其中包括基于.Net Tasks的调度功能(不是标准TaskScheduler,IScheduler...).我正在使用TaskCompletionSource,并且Task.Status对于表示底层操作的状态至关重要,包括 TaskStatus.Created即已创建但尚未启动.我知道返回的任务通常应该很热,但对于我手动控制的代理任务,我确实最初想要它们Created.

不幸的是,我的初始状态TaskCompletionSource.TaskWaitingForActivation,即它已经过去了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)

.net c# task-parallel-library async-await

9
推荐指数
1
解决办法
529
查看次数

标签 统计

.net ×1

async-await ×1

c# ×1

task-parallel-library ×1