2013-03-21 87 views
1

我希望能夠使用計劃任務代理更新我的鎖定屏幕圖像。我看過Building Windows Phone 8 Apps Development Jump Start這是一篇不錯的文章。 我的問題是在這個視頻中顯示瞭如何更改背景與孤立存儲器上的圖片。 使用:使用ScheduledTaskAgent更新鎖定屏幕

Uri imageUri = new Uri("ms-appdata:///local/shared/shellcontent/background2.png",       UriKind.RelativeOrAbsolute); 

這是不是我的情況(我需要從一個Web服務下載)。 我用一段代碼創建了一個小項目,該代碼應該下載一張圖片,將其存儲到我的獨立存儲中,然後用它上傳我的鎖定屏幕(我想這是做我想做的最好的方法)。

要做到這一點我用:

protected override void OnInvoke(ScheduledTask task) 
{ 
    Deployment.Current.Dispatcher.BeginInvoke(() => 
     { 
      SavePictureInIsolatedStorage(
       new Uri(
        "http://www.petfinder.com/wp-content/uploads/2012/11/101418789-cat-panleukopenia-fact-sheet-632x475.jpg")); 

     // LockHelper(); 
      NotifyComplete(); 
     }); 

} 

和:

private async void SavePictureInIsolatedStorage(Uri backgroundImageUri) 
{ 

    BitmapImage bmp = new BitmapImage(); 
    await Task.Run(() => 
         { 

          var semaphore = new ManualResetEvent(false); 
          Deployment.Current.Dispatcher.BeginInvoke(()=> 
            { 
             bmp = new BitmapImage(backgroundImageUri); 
             semaphore.Set(); 
            }); 
          semaphore.WaitOne(); 
         }); 
    bmp.CreateOptions = BitmapCreateOptions.None; 
    WriteableBitmap wbmp = new WriteableBitmap(bmp); 

    using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     var file = "shared/shellcontent/lockscreen.png"; 
     // when file exists, delete it 
     if (myIsolatedStorage.FileExists(file)) 
     { 
      myIsolatedStorage.DeleteFile(file); 
     } 

     using (var isoFileStream = new IsolatedStorageFileStream(file, FileMode.Create, myIsolatedStorage)) 
     { 
      // use ToolStackPNGWriterExtensions 
      ToolStackPNGWriterLib.PNGWriter.WritePNG(wbmp, isoFileStream); 

     } 

    } 

} 

我的問題有我的位圖圖像不會似乎被下載。 我也嘗試過使用WebClient,因此我面臨着同樣的結果。

回答

4

您並未等待您的來電,因此NotifyComplete()將在任何有機會運行之前被調用。你可以通過聲明你的lambda函數爲async來解決這個問題。

protected override void OnInvoke(ScheduledTask task) 
{ 
    Deployment.Current.Dispatcher.BeginInvoke(async() => 
    { 
     await SavePictureInIsolatedStorage(
      new Uri(
       "http://www.petfinder.com/wp-content/uploads/2012/11/101418789-cat-panleukopenia-fact-sheet-632x475.jpg")); 

     NotifyComplete(); 
    }); 
} 

但是看你的方法並不需要太長時間運行,否則你的計劃任務將不會再安排(在這種2個故障)。

+3

此外,作爲一般規則,避免'async void';除非您正在編寫事件處理程序,否則請使用'async Task'。 – 2013-03-21 15:43:55

+0

更具體地說,BeginInvoke中的lambda是async void。閱讀PFX團隊博客的詳細信息http://blogs.msdn.com/b/pfxteam/archive/2012/02/08/10265476.aspx – 2014-06-08 09:01:45

+0

@AlexSorokoletov - 當然,lambda是async void,因爲我無法修改'BeginInvoke 'API。真正的問題是OP代碼中的'SavePictureInIsolatedStorage'方法是'async void',而它應該是'async Task'。請參閱http://msdn.microsoft.com/en-us/magazine/jj991977.aspx。 – 2014-06-09 12:22:05