[英]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.