我正在使用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调用中,它似乎被锁定,只有在第一次调用之后 - 这总是成功的。
至少让我有点困惑。
任何人都能提供任何见解吗?
提前致谢
答案 0 :(得分:1)
你在异步操作上调用Result
。这将导致UI线程阻塞,直到异步操作完成。异步操作需要等待UI线程空闲,以便可以在UI线程中安排LoadListingInformationAsync
的继续。
两个行动都在等待彼此完成。死锁。
在等待此操作完成时,您需要不阻止UI线程。您应该await
代替ShowDescrProduct
和async
方法。