Blazor 启动错误:System.Threading.SynchronizationLockException:无法在此运行时等待监视器

JKe*_*rny 5 async-await blazor blazor-client-side blazor-webassembly

我试图在 blazor(客户端)启动期间调用 api 以将语言翻译加载到 ILocalizer 中。

在这一点上,我尝试从 get 请求中获取 .Result blazor 在标题中引发错误。

这可以通过在 program.cs 中调用此方法来复制

  private static void CalApi()
    {
        try
        {
            HttpClient httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(@"https://dummy.restapiexample.com/api/v1/employees");
            string path = "ididcontent.json";
            string response = httpClient.GetStringAsync(path)?.Result;
            Console.WriteLine(response);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Error getting api response: " + ex);
        }

    }
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 5

避免.Result,很容易死锁。您会收到此错误,因为单线程 webassembly 不(不能)支持该机制。我会认为这是一个功能。如果它可以在监视器上等待,它就会冻结。

private static async Task CalApi()
{
   ... 
   string response = await httpClient.GetStringAsync(path); 
   ...
}
Run Code Online (Sandbox Code Playgroud)

所有事件和生命周期方法覆盖都可以async Task在 Blazor 中,因此您应该能够适应它。