Dispatcher.BeginInvoke方法在第二次执行后'冻结'

时间:2014-04-15 18:56:21

标签: c# multithreading unity3d dispatcher begininvoke

我正在使用Unity3d制作Windows手机游戏,我需要从UI线程异步调用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();

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

持有&#39;的班级。统一的方法是这样的:

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.BeginInvoke的EnterUIThread调用中,它似乎被锁定,只有在第一次调用之后 - 这总是成功的。

至少让我有点困惑。

任何人都能提供任何见解吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

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

两个行动都在等待彼此完成。死锁。

在等待此操作完成时,您需要阻止UI线程。您应该await代替ShowDescrProductasync方法。