我有一个返回异步任务的方法。我希望这样称呼,但我想自定义发送给它的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);
}
答案 0 :(得分:6)
我希望在这里提供创建选项,即LongRunning,和 也可能是取消令牌
您无法在TaskCreationOptions
方法返回的Task
对象上自定义async
。从本质上讲,它没有意义:你不能在这里创建初始Task
,Task.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)
你不能,而且你不需要。这些选项都不符合您的想法。
LongRunning
对async
工作负载无效;它会(在当前实现中)启动一个单独的专用线程来执行async
方法的第一部分(直到不完整操作的第一个await
),然后恢复{{1作为常规工作的方法排队到线程池,忽略该方法其余部分的专用线程。
将async
传递给任务构造函数是不必要的;它会在CancellationToken
代码中获得的唯一好处是,如果令牌已经取消,代码将无法启动。在调用async
方法之前,只需自己检查就可以做同样的事情。使用async
方法处理取消的正确方法在Task-based Asynchronous Pattern documentation:
async