나는 인터넷의 이미지를 사용하여 lockscreen의 배경을 변경하는 WP8 응용 프로그램을 작성하고 있습니다. 나는 Scheduled Agents와 Lockscreen에 관한 튜토리얼을 따라 갔지만 문제가있다. 내가 예약 된 에이전트에서 새 배경 이미지를 다운로드하려고하면예약 된 에이전트에서 이미지를 저장할 때 System.UnauthorizedAccessException
,이 얻을 :
+ $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가 작동하지 않는 경우 어떻게 예약 된 에이전트에 이미지를 저장할 수 있습니까? 내가 "크로스 스레드 액세스"를한다는 것은 무엇을 의미합니까? 이미지는 예약 된 에이전트에 의해서만 만들어지고 사용되므로 아무도 해당 이미지에 액세스해야합니다.
감사합니다! 부끄러운 줄 알았는데, 예약 된 작업에서 Dispatcher를 사용할 수 있다고 생각지 않습니다. 이제는 매력처럼 작동합니다 ... 작은 System.OutOfMemoryException을 제외하고는 이미지 크기로 인해 발생합니다. ;) – blueocean