获取异步结果死锁(尽管将configure await设置为false)

Pro*_*rof 2 c# multithreading deadlock asynchronous async-await

我正在做一些OAuth工作,我通过提供的异步API方法获取刷新令牌(GetRefreshTokenAsync):

public async Task<Tokens> RenewAuthentication()
{
    AppTokenResult token = await OAuth.GetRefreshTokenAsync("clientid",
      "clientsecret", 
    @"myRefreshToken");

    string accessToken = token.AccessToken;
    string refreshToken = token.RefreshToken;

    return new Tokens(accessToken, refreshToken);

}
Run Code Online (Sandbox Code Playgroud)

如果我像非异步方法那样调用它:

public void noAsync()
{
    var r = RenewAuthentication();
    var x = r.Result;
}
Run Code Online (Sandbox Code Playgroud)

它使应用程序陷入僵局:(.如果我删除第二行(r.Result),那么它可以工作,但那是废话,因为我无法得到结果.我试过阅读

http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

但是在通过向GetRefreshTokenAsync()方法添加.ConfigureAwait(false)来尝试他的方法1后,它没有任何区别.

有什么建议?

Yuv*_*kov 5

它使应用程序陷入僵局:(

这就是async在具有自定义同步的环境中对方法进行阻塞的方法.

如果你在"FormLoad"上调用它,则不需要阻止.只需标记您的事件处理程序,async就可以await进行操作:

public Form()
{
    this.Load += OnLoadHandler;
}

public async void OnLoadHandler(object sender, EventArgs e)
{
    var result = await RenewAuthenticationAsync();
    // Store the result here
}
Run Code Online (Sandbox Code Playgroud)