考虑到:
“只有返回void,Task或Task的方法才能被标记为async ...”
如果我需要在“等待”任务时调用逻辑或启动某些东西,在这种情况下,当OnCompleted(Action continuation)
实现UnsafeOnCompleted(Action continuation)
或TaskAwaiter
时,我可以在某种程度上做到了吗?
例如:
我需要模拟一些返回Task<T>
的实现,在这种情况下我的模拟需要使用并继续只有一个Thread
,但是无法操纵SynchronizationContext
。
我知道这是一个非常具体的场景,但仅仅是为了理论。同样地,有Unwrap()
方法,有类似Wrap(IAwaitable accessAwaiter)
吗?
如果Task
仅在{等待'await
时启动,则它已解决了我的问题。谢谢你的帮助。
答案 0 :(得分:3)
没有。但是如果真的需要这样做,你可以编写自己的awaiter,你可以嘲笑。
答案 1 :(得分:1)
我不建议这样做,但是你可以在等待发生时开始Task
。
这是一个玩具示例,再次,我不建议使用:
public static TaskAwaiter GetAwaiter(this TimeSpan timeSpan)
{
return Task.Delay(timeSpan).GetAwaiter();
}
用法:
await TimeSpan.FromSeconds(3);
类似于foreach
循环扩展为在枚举上调用GetEnumerator()
的代码的方式,await <expression>
是一个表达式,扩展为使用一堆调用(<expression>).GetAwaiter()
的代码继续发生的其他魔法。
如果你想要的只是await
Task
可能还没有开始,如果还没有开始就启动它,你可以简单地使用它:
public static Task EnsureStarted(this Task task)
{
if (task.Status == TaskStatus.Created)
{
try
{
task.Start();
}
catch (InvalidOperationException) { }
}
return task;
}
并像这样使用:
await task.EnsureStarted();