给定以下扩展以防止Tasks
阻塞ui线程(可能不是准确的正确术语,但无论如何):
public static ConfiguredTaskAwaitable DontBlock( this Task T ) {
return T.ConfigureAwait( false );
}
public static ConfiguredTaskAwaitable<T> DontBlock<T>( this Task<T> T2 ) {
return T2.ConfigureAwait( false );
}
在某些情况下(例如,如果我需要在对象构造函数中调用可等待的,或者如果我需要从winforms
.Wait( )
方法调用Program.Main( )
,我需要执行以下操作:public class Foo{
public Foo( ){
//I know full well that the result from DontBlock does not have a 'wait' method, so of course this will fail miserably.
AwaitableBar.DontBlock( ).Wait( );
}
}
如果我不能对它调用
async
函数/方法,我如何在它之外“等待”?我看到它有一个.Wait( )
方法返回一个.GetAwaiter( )
对象,但我不知道该怎么办,谷歌又让我失望了……我应该马上调用返回对象上的ConfiguredTaskAwaiter
吗?这样做会等待一切结束,还是跳过它,或者爆炸? 最佳答案
我同意@usr的说法,返回aConfiguredTaskAwaitable
并不理想。通常,异步方法应该返回任务。这是一个关注点分离的问题。
不过,一旦有了ConfiguredTaskAwaitable
,只需调用awaitableObj.GetAwaiter().GetResult()
(或适当的替换)。GetResult()
将阻塞。