【问题标题】:Async calls in blazor app hang forever and never errorBlazor 应用程序中的异步调用永远挂起,永远不会出错
【发布时间】:2020-05-06 15:38:37
【问题描述】:

我试图在一个 cs 类中调用一个异步方法,但页面只是冻结了。 调试时,一切似乎都运行良好,直到 await thing.wait.WaitAsync(); 行。在该行之后,没有其他断点被命中(我周围有一堆断点,包括下一行的一个),页面看起来一直在加载,并且没有弹出错误/异常消息。

ApiClient_Test.razor

@if (myResult == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <p>@myResult</p>
}
@code{
    private string myResult;

    protected override async Task OnInitializedAsync()
    {
    var test = new ApiClient_BlazorTest.ApiClientBlazorTests.ApiClient_TestAsync();
    myResult = test.MyMethod();
    }
}

ApiClientTest.cs

namespace ApiClient_BlazorTest.ApiClientBlazorTests
{
    public class ApiClient_TestAsync : Controller
    {
        public string MyMethod()
        {
            var a = MyAsyncMethod();
            a.Wait();

            return a.Result;
        }

        public async Task<string> MyAsyncMethod()
        {
            var thing = new athing();

            // start a thing that takes 6 seconds
            thing.dothings();
            // await the thing
            await thing.wait.WaitAsync();
            return "ok";
        }

        private class athing
        {
            public SemaphoreSlim wait { get; set; } = new SemaphoreSlim(1);
            public string dothings()
            {
                wait.Wait();
                Task.Run(() => { Thread.Sleep(6000); wait.Release(); });
                return "";
            }
        }   
    }
}

我在控制台应用程序上运行了相同的代码。那里一切正常。

以前有人见过类似的 blazor 和 async 函数吗?

【问题讨论】:

  • 控制台应用在异步方面非常不同。

标签: c# asynchronous client blazor


【解决方案1】:

Blazor 渲染有一个SynchronizationContext,所以blocking on asynchronous code can cause a deadlock

最好的解决方案是删除所有阻塞调用 - 即使用await 而不是Wait()Result

public async Task<string> MyMethodAsync() // was `public string MyMethod()`
{
  var a = MyAsyncMethod();
  // await a; // was `a.Wait();`

  return await a; // was `return a.Result;`
}

我在控制台应用程序上运行了相同的代码。那里一切正常。

控制台应用程序没有SynchronizationContext,因此在那个环境中不会发生这种死锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 2017-06-08
    • 2014-08-22
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2016-01-16
    • 2012-09-20
    相关资源
    最近更新 更多