异步任务方法的TaskCreationOptions

时间:2014-03-11 23:15:09

标签: .net task-parallel-library task async-await c#-5.0

我有一个返回异步任务的方法。我希望这样称呼,但我想自定义发送给它的TaskCreationOptions,我是否正在尝试为此制定最佳实践,或者我应该如何修改我的方法?

样品..

void Main(){        
    _runTask=Test(); // I wish to provide creation options here, ie LongRunning, and possibly also a cancellation token
}
async Task Test()
{
    await Task.Delay(10);
}

2 个答案:

答案 0 :(得分:6)

  

我希望在这里提供创建选项,即LongRunning,和   也可能是取消令牌

您无法在TaskCreationOptions方法返回的Task对象上自定义async。从本质上讲,它没有意义:你不能在这里创建初始TaskTask.Delay。你可以这样想:

Task Test()
{
    var scheduler = SynchronizationContext.Current != null ?
        TaskScheduler.FromCurrentSynchronizationContext() :
        TaskScheduler.Current;

    return Task.Delay(10).ContinueWith((t) => { }, 
        CancellationToken.None,
        TaskContinuationOptions.None, scheduler);
}

现在,可以控制TaskContinuationOptions ContinueWith(包括TaskContinuationOptions.LongRunning)返回的任务TaskCreationOptions,而不是async Task Test(CancellationToken token) { await Task.Delay(10, token); // ... token.ThrowIfCancellationRequested(); }

但您可以提供取消令牌:

{{1}}

答案 1 :(得分:5)

你不能,而且你不需要。这些选项都不符合您的想法。

LongRunningasync工作负载无效;它会(在当前实现中)启动一个单独的专用线程来执行async方法的第一部分(直到不完整操作的第一个await),然后恢复{{1作为常规工作的方法排队到线程池,忽略该方法其余部分的专用线程。

async传递给任务构造函数是不必要的;它会在CancellationToken代码中获得的唯一好处是,如果令牌已经取消,代码将无法启动。在调用async方法之前,只需自己检查就可以做同样的事情。使用async方法处理取消的正确方法在Task-based Asynchronous Pattern documentation

中有所描述
async