System.UnauthorizedAccessException при сохранении изображения из запланированного агента
Я создаю приложение WP8, которое меняет фон экрана блокировки, используя изображения из Интернета. Я следовал инструкциям по Запланированным агентам и Экрану блокировки, но у меня есть проблема.
Когда я пытаюсь загрузить новое фоновое изображение от запланированного агента, я получаю это:
+ $exception {System.UnauthorizedAccessException: Invalid cross-thread access.
at MS.Internal.XcpImports.CheckThread()
at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex, IntPtr constructDO)
at System.Windows.Media.Imaging.BitmapImage..ctor()
at TileLockAgent.ScheduledAgent.lockScreenClient_OpenReadCompleted(Object sender, OpenReadCompletedEventArgs e)
at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)
at System.Net.WebClient.OpenReadOperationCompleted(Object arg)
at System.Threading.WaitCallback.Invoke(Object state)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()} System.Exception {System.UnauthorizedAccessException}
Код является:
string fileName;
try
{
var currentImage = LockScreen.GetImageUri();
if (currentImage.ToString().EndsWith("_1.jpg"))
{
fileName = "LockBackground_2.jpg";
}
else
{
fileName = "LockBackground_1.jpg";
}
}
catch
{
// lockscreen not set or prev owned by other app
fileName = "LiveLockBackground_1.jpg";
}
using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
var bi = new BitmapImage();
bi.SetSource(e.Result);
var wb = new WriteableBitmap(bi);
using (var isoFileStream = isoStore.CreateFile(fileName))
{
var width = wb.PixelWidth;
var height = wb.PixelHeight;
Extensions.SaveJpeg(wb, isoFileStream, width, height, 0, 100);
}
}
Я действительно не знаю, как решить это. Как я могу сохранить изображение в запланированном агенте, если BitmapImage не работает? Что это значит, что я делаю "межпоточный доступ"? Изображения создаются и используются только запланированным агентом, поэтому никто не должен получать к ним доступ.
1 ответ
Проблема возникает из-за того, что BitmapImage не может быть создан вне потока пользовательского интерфейса. Вы можете решить эту проблему, поместив свои вызовы в вызов Dispatcher Invoke.
Однако вам необходимо убедиться, что вы правильно вызвали NotifyComplete. Таким образом, вам может понадобиться поместить NotifyComplete в вызов Dispatcher.
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
UpdateSyncPictureName(...);
NotifyComplete();
});
Источник: недопустимое перекрестное исключение для агента планирования при работе в изолированном хранилище