调度员.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,它似乎被锁定了,只有在第一次调用之后——这总是成功的。
至少可以说,这让我有点困惑。
有人能提供任何见解吗?
提前感谢
您正在对异步操作调用Result
。这将导致UI线程阻塞,直到异步操作完成。异步操作需要等待UI线程空闲,以便可以在UI线程中调度对LoadListingInformationAsync
的继续。
两项操作都在等待对方完成。僵局
在等待此操作完成时,您需要而不是阻塞UI线程。你应该改为await
,使ShowDescrProduct
和async
方法。