我怎么做”.Wait( )“在 ConfigurationTaskAwaitable 上

本文关键字:ConfigurationTaskAwaitable Wait | 更新日期: 2023-09-27 18:33:27

给定以下扩展名以防止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 );
    }

在某些情况下(例如,如果我需要在对象构造函数中调用 awaitable,或者如果我需要从 WinForms Program.Main( ) 方法调用.Wait( )),我需要执行以下操作:

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( )?我看到它有一个返回ConfiguredTaskAwaiter对象的.GetAwaiter( )方法,但我不知道如何处理它,谷歌又让我失望了......我应该立即对返回的对象调用GetResult( )吗?这样做会等到一切都完成,还是直接跳过它,或者爆炸?

我怎么做”.Wait( )“在 ConfigurationTaskAwaitable 上

我同意返回ConfiguredTaskAwaitable并不理想的@usr。通常,异步方法应返回任务。这是一个分离关切的问题。

但是,一旦您有ConfiguredTaskAwaitable,只需调用awaitableObj.GetAwaiter().GetResult()(或适当的替换)。 GetResult()会阻止。

也许,您不应该从任何内容返回ConfiguredTaskAwaitable。这是仅在await t.ConfigureAwait( false)模式中需要的帮助程序类型。 await t.DontBlock()也很好,但不要传递这种类型。我认为这样做没有任何意义。

您似乎认为ConfigureAwait(false)解锁 UI 线程。并非如此。等待总是阻塞线程。阻塞意味着此线程无法继续执行。 如果基础任务未完成,Wait会导致这种情况。

所以很可能,你想完成的事情并没有完成。在 UI 线程上使用await。如果要阻止,请在非 UI 线程上使用Wait()

AwaitableBar.DontBlock( ).Wait()告诉我你有一些错误的信念。在这里,DontBlock不会解锁任何东西。即使此代码有效,它也不执行任何操作。

如果解锁线程那么容易,我们为什么还需要await?!

相关文章:
  • 没有找到相关文章