繁体   English   中英

是否只有在“等待”发生时才启动任务?

[英]Is there a way to start a task only when “await” happens?

考虑到:

“仅将返回void,Task或Task的方法标记为异步...”

如果仅在任务“等待”时才需要调用逻辑或启动某种东西,在这种情况下,当TaskAwaiter实现的方法OnCompleted(Action continuation)UnsafeOnCompleted(Action continuation)TaskAwaiter怎么办?

例如:

我需要模拟一些返回Task<T> ,在这种情况下,我的模拟只需要使用并在一个Thread继续进行,而绝不能操纵SynchronizationContext

我知道这是一个非常特定的场景,但仅是理论上的。 同样,有Unwrap()方法,是否有Wrap(IAwaitable accessAwaiter)类的东西?

如果Task仅在await为“ awaited”时才启动,则它已经解决了我的问题。 谢谢你的帮助。

不可以。但是,如果您确实需要这样做,可以编写自己的模拟服务员。

我不建议这样做,但是是的,您可以在等待发生时启动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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM