在我的游戏中,我注意到有些冻结,因为AdComponent
试图从互联网上下载一个新的广告,以便在我的游戏上绘制。
如何初始化冻结功能:
// Declarations
DrawableAd drawableAd;
// Inside constructor of my game class
AdComponent.Initialize("MyAppId");
Rectangle rect = new Rectangle(0, resolution_h_ - 50, 320, 50);
drawableAd_ = AdComponent.Current.CreateAd("AdId", rect, false); // false is to set AutoRefresh of the ad
要使广告可点击并下载,我必须在每个更新步骤中致电:AdComponent.Current.Update(e_.ElapsedTime);
问题是如果我同步调用它会让我的游戏在下载新广告时冻结一段时间:
private void OnUpdate(object sender, GameTimerEventArgs e)
{
// ... GameUpdates
AdComponent.Current.Update(e.ElapsedTime);
}
所以,我认为解决方法是将AdComponent.Current.Update(e.ElapsedTime);
放在后台线程上,使用“低优先级”来解决冻结问题。所以我做了:
private async void UpdateAds()
{
if (ad_update_completed_)
await Task.Factory.StartNew(() => UpdateAdsMethod());
}
private async Task UpdateAdsMethod()
{
ad_update_completed_ = false;
AdComponent.Current.Update(e_.ElapsedTime);
ad_update_completed_ = true;
}
private void OnUpdate(object sender, GameTimerEventArgs e)
{
// ... GameUpdates
e_ = e;
UpdateAds();
}
在此之后,我注意到(不使用探查器)大多数冻结(不是全部)已经消失。但我有一些疑问,因为编译器发出警告说UpdateAdsMethod();
将同步执行。
我做错了什么?
答案 0 :(得分:1)
AdComponent.Current.Update ()不会返回任务,因此可以简化 UpdateAdsMethod (参见下文)。由于您在子任务中调用 UpdateAdsMethod (),因此无需返回其他任务。它应该简单地解读如下:
private void UpdateAdsMethod()
{
ad_update_completed_ = false;
AdComponent.Current.Update(e_.ElapsedTime);
ad_update_completed_ = true;
}
这应该消除编译器警告。请注意,如果在任何方法中使用等待关键字,则使用等待的方法的签名必须在方法声明中包含 async 。请参阅下面的 UpdateAds()。
您的方法肯定在后台运行,因为调用是在子任务中(您在 UpdateAds ()期间创建了它。
编辑:所以您的代码现在应该类似于:
private async Task UpdateAds()
{
if (ad_update_completed_)
await Task.Factory.StartNew(() => UpdateAdsMethod());
}
private void UpdateAdsMethod()
{
ad_update_completed_ = false;
AdComponent.Current.Update(e_.ElapsedTime);
ad_update_completed_ = true;
}
有关详细信息,请访问http://msdn.microsoft.com/en-us/magazine/jj991977.aspx