Действие не вызывается Dispatcher.BeginInvoke()
Я создаю игру для Windows Phone 8, используя MonoGame. Бесплатная версия будет иметь рекламу в верхней части. Для показа рекламы я использую AdRotator. В игре есть возможность публиковать результаты в Facebook в виде изображения. Недавно во время тестирования я обнаружил, что игра полностью зависает при публикации изображения в Facebook. Во время отладки мне удалось обнаружить код, который вызывает это зависание. Этот код является частью MonoGame:
var waitEvent = new ManualResetEventSlim(false);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var bitmap = new WriteableBitmap(width, height);
System.Buffer.BlockCopy(pixelData, 0, bitmap.Pixels, 0, pixelData.Length);
bitmap.SaveJpeg(stream, width, height, 0, 100);
waitEvent.Set();
});
waitEvent.Wait();
Итак, поток MonoGame ожидает установки waitEvent, но BeginInvoke не вызывает действие. Когда нет AdControl, все в порядке, так что для меня похоже, что AdRotator и MonoGame как-то конфликтуют, но я не совсем понимаю, почему это могло произойти.
UPD: пример кода, который вызывает код сверху
RenderTarget2D renderTarget = new RenderTarget2D(ScreenManager.GraphicsDevice, width, height, false, SurfaceFormat.Color, DepthFormat.Depth24);
ScreenManager.GraphicsDevice.SetRenderTarget(renderTarget);
ScreenManager.GraphicsDevice.Clear(Color.White);
SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
spriteBatch.Begin();
// drawing some graphics
spriteBatch.End();
ScreenManager.GraphicsDevice.SetRenderTarget(null);
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var stream = store.OpenFile(FacebookShareFileName, FileMode.Create, FileAccess.ReadWrite))
{
renderTarget.SaveAsJpeg(stream, width, height);
}
}
так что игра зависает на
renderTarget.SaveAsJpeg(stream, width, height);
1 ответ
Попробуй это,
Передайте контекст синхронизации методу.
SynchronizationContext uiThread = SynchronizationContext.Current;
public WritableBitmap GetImage(SynchronizationContext uiThread))
{
WriteableBitmap bitmap = null;
var waitHandle = new object();
lock (waitHandle)
{
uiThread.Post(_ =>
{
lock (waitHandle)
{
bitmap = new WriteableBitmap(width, height);
System.Buffer.BlockCopy(pixelData, 0, bitmap.Pixels, 0, pixelData.Length);
bitmap.SaveJpeg(stream, width, height, 0, 100);
Monitor.Pulse(waitHandle);
}
}, null);
Monitor.Wait(waitHandle);
}
return bitmap;
}
И вызвать этот метод в другом потоке;
SynchronizationContext uiThread = SynchronizationContext.Current;
var result = await Task.Factory.StartNew<WriteableBitmap>(() =>
{
return GetImage(uiThread);
});
Я не добавил в код pixelData Your pixel array. Пожалуйста, передайте эту информацию в свой код. Также я набрал код из виду, не проверенный в редакторе VS. Таким образом, вы можете найти некоторые опечатки, пожалуйста, игнорируйте это. Надеюсь, что это решит вашу проблему. Наслаждайтесь кодированием