4

インターネットからの画像を使用してロック画面の背景を変更する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が機能していない場合、スケジュールされたエージェントに画像を保存するにはどうすればよいですか?「クロススレッドアクセス」を行っているとはどういう意味ですか?イメージはスケジュールされたエージェントによってのみ作成および使用されるため、誰もそれらにアクセスしないでください。

4

1 に答える 1

6

この問題は、BitmapImage を UI スレッドの外でインスタンス化できないという事実から発生します。Dispatcher Invoke 呼び出しで呼び出しをラップすることで、この問題を解決できます。

ただし、NotifyComplete を正しく呼び出す必要があります。そのため、NotifyComplete を Dispatcher 呼び出しに入れる必要がある場合があります。

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

ソース:分離ストレージで作業している場合のスケジュール エージェントの無効な交差例外

于 2012-12-14T13:22:40.597 に答える