ConfiguredTaskAwaitable

ConfiguredTaskAwaitable

给定以下扩展以防止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()将阻塞。

10-07 12:10