有没有办法在" await"发生?

时间:2014-09-26 01:46:28

标签: c# .net async-await

考虑到:

  

“只有返回void,Task或Task的方法才能被标记为async ...”

如果我需要在“等待”任务时调用逻辑或启动某些东西,在这种情况下,当OnCompleted(Action continuation)实现UnsafeOnCompleted(Action continuation)TaskAwaiter时,我可以在某种程度上做到了吗?

例如:

我需要模拟一些返回Task<T>的实现,在这种情况下我的模拟需要使用并继续只有一个Thread,但是无法操纵SynchronizationContext

我知道这是一个非常具体的场景,但仅仅是为了理论。同样地,有Unwrap()方法,有类似Wrap(IAwaitable accessAwaiter)吗?

如果Task仅在{等待'await时启动,则它已解决了我的问题。谢谢你的帮助。

2 个答案:

答案 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();