4

나는 인터넷의 이미지를 사용하여 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가 작동하지 않는 경우 어떻게 예약 된 에이전트에 이미지를 저장할 수 있습니까? 내가 "크로스 스레드 액세스"를한다는 것은 무엇을 의미합니까? 이미지는 예약 된 에이전트에 의해서만 만들어지고 사용되므로 아무도 해당 이미지에 액세스해야합니다.

답변

6

BitmapImage를 UI 스레드 외부에서 인스턴스화 할 수 없기 때문에 문제가 발생합니다. Dispatcher Invoke 호출에서 호출을 랩핑하여이. 제점을 수정할 수 있습니다.

그러나 NotifyComplete를 올바르게 호출해야합니다. 따라서 NotifyComplete를 Dispatcher 호출에 넣어야 할 수도 있습니다.

Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     UpdateSyncPictureName(...); 
     NotifyComplete(); 
    }); 

출처 : Invalid Cross Exception on Schedule Agent when working on isolated storage

+0

감사합니다! 부끄러운 줄 알았는데, 예약 된 작업에서 Dispatcher를 사용할 수 있다고 생각지 않습니다. 이제는 매력처럼 작동합니다 ... 작은 System.OutOfMemoryException을 제외하고는 이미지 크기로 인해 발생합니다. ;) – blueocean

관련 문제