调度员.BeginInvoke方法';冻结';在第二次执行之后

本文关键字:第二次 执行 之后 冻结 BeginInvoke 调度员 方法 | 更新日期: 2023-09-27 17:58:23

我正在用Unity3d制作一个windows手机游戏,我需要从Unity线程异步调用一个方法。

这一切都起作用,然而,对于一个特定的方法,第一次执行如预期执行,但在第二次执行之后,似乎锁定了游戏。

private async static Task<String> ShowDescriptionProductListing()
    {
        var x = await CurrentApp.LoadListingInformationAsync();
        StringBuilder builder = new StringBuilder();
        builder.AppendFormat("{0}'n{1}", x.Description,
                                     x.ProductListings.FirstOrDefault().Value);
        return builder.ToString();
    }
    public static void ShowDescrProduct()
    {
        string x = ShowDescriptionProductListing().Result;
        MessageBox.Show(x);
    }

我认为线路:

 var x = await CurrentApp.LoadListingInformationAsync();

很可能是罪魁祸首,但我很难调试它。

统一"持有"该方法的类是这样的:

public static class HelperClass
{
   public static void ShowDescrProduct()
   {
          Dispatcherr.InvokeOnUIThread(Tests.ShowDescrProduct); //The method above
   }
}

Dispatcherr(是的,我需要使用名称空间哈哈)只持有我在UI线程中设置的两个Action属性。

    public void EnterUIThread(Action action)
    {
        Dispatcher.BeginInvoke(() => 
        {
            action();
        });
    }
    private void Unity_Loaded()
    {
        Dispatcherr.InvokeUIThread = EnterUIThread; //One of the actions I just 
                                                  //mentioned being assigned the above
                                                  //method
    }

它在对Dispatcher的EnterUIThread调用中。BeginInvoke,它似乎被锁定了,只有在第一次调用之后——这总是成功的。

至少可以说,这让我有点困惑。

有人能提供任何见解吗?

提前感谢

调度员.BeginInvoke方法';冻结';在第二次执行之后

您正在对异步操作调用Result。这将导致UI线程阻塞,直到异步操作完成。异步操作需要等待UI线程空闲,以便可以在UI线程中调度对LoadListingInformationAsync的继续。

两项操作都在等待对方完成。僵局

在等待此操作完成时,您需要而不是阻塞UI线程。你应该改为await,使ShowDescrProductasync方法。