2014-09-05 53 views
3

我有這個代碼執行httpwebrequest和響應背景方法,我只想顯示對話框的信息,當下載郵編崩潰,我的代碼輸入在此捕獲...在Windows Phone 8.1中的背景任務顯示對話框的問題

private void DoSincroFit() 
    { 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
     request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
    } 

    public async void playResponseAsync(IAsyncResult asyncResult) 
    { 
     //Declaration of variables 
     HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

     try 
     { 
      string fileName = "sincrofit.rar"; 

      using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) 
      { 
       byte[] buffer = new byte[1024]; 


       var newZipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 
       var newZipFile = await KnownFolders.DocumentsLibrary.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

       using (var writeStream = await newZipFile.OpenAsync(FileAccessMode.ReadWrite)) 
       { 
        using (var outputStream = writeStream.GetOutputStreamAt(0)) 
        { 
         using (var dataWriter = new DataWriter(outputStream)) 
         { 
          using (Stream input = webResponse.GetResponseStream()) 
          { 
           var totalSize = 0; 
           for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length)) 
           { 
            dataWriter.WriteBytes(buffer); 
            totalSize += size; //get the progress of download 
           } 
           await dataWriter.StoreAsync(); 
           await outputStream.FlushAsync(); 
           dataWriter.DetachStream(); 
          } 
         } 
        } 
       } 

      } 
     } 
     catch 
     { 
      SMethods.Message_Dialog("Download has stopped!","Error"); 
     } 
    } 

但是,當我的代碼執行這種方法,從這個類:

class StandarMethods 
{ 
public async void Message_Dialog(string text, string title) 
    { 
     //Declaration of variables 
     MessageDialog MDialog = new MessageDialog(text, title); 

     await MDialog.ShowAsync(); 
    } 
} 

最後我的應用程序崩潰時,嘗試執行:

await MDialog.ShowAsync(); 

這是在後臺任務等待...有人可以幫助我嗎?有可能使用事件處理程序?爲什麼?怎麼樣?提前致謝!

回答

2

解決,我的最終代碼是在這裏:

private CoreDispatcher dispatcher; 

    private void DoSincroFit() 
    { 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 

     //Add headers to request 
     request.Headers["Type"] = "sincrofit"; 
     request.Headers["Device"] = "1"; 
     request.Headers["Version"] = "0.000"; 
     request.Headers["Os"] = "WindowsPhone"; 

     dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
     request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
    } 

    public async void playResponseAsync(IAsyncResult asyncResult) 
    { 
     //Declaration of variables 
     HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

     try 
     { 
      //For download file with stream 
      //http://social.msdn.microsoft.com/Forums/windowsapps/en-US/de96a61c-e089-4595-8349-612be5d23ee6/download-file-with-httpwebrequest?forum=winappswithcsharp 
      string fileName = "sincrofit.rar"; 

      using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) 
      { 
       byte[] buffer = new byte[1024]; 

       //For acces Local folder of phone device 
       //http://social.msdn.microsoft.com/Forums/windowsapps/en-US/ec99721c-6565-4ce9-b6cc-218f2265f9c7/what-is-the-uri-of-an-isolatedstorage-file?forum=wpdevelop 
       var newZipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

       using (var writeStream = await newZipFile.OpenAsync(FileAccessMode.ReadWrite)) 
       { 
        using (var outputStream = writeStream.GetOutputStreamAt(0)) 
        { 
         using (var dataWriter = new DataWriter(outputStream)) 
         { 
          using (Stream input = webResponse.GetResponseStream()) 
          { 
           var totalSize = 0; 

           for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length)) 
           { 
            dataWriter.WriteBytes(buffer); 
            totalSize += size; //get the progress of download 

            dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
            { 
             //Declaration of variables 
             pBar.Value = sizeFit/totalSize * 100; 
            }); 
           } 
           await dataWriter.StoreAsync(); 
           await outputStream.FlushAsync(); 
           dataWriter.DetachStream(); 
          } 
         } 
        } 
       } 

      } 
     } 
     catch 
     { 
      dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       //Declaration of variables 
       SMethods.Message_Dialog("Download has stopped!", "Error"); 
      }); 
     } 
    } 

感謝您的時間@loop!

2

Merli你的問題是你正試圖從一個背景胎面訪問UI線程來顯示對話框,用戶因此使用調度這個基本的例子是: -

// This is for silverlight part 
    Deployment.Current.Dispatcher.BeginInvoke(delegate 
    { 
     var mbr = MessageBox.Show("Are you sure you want to leave this page?", "Warning",  
     MessageBoxButton.OKCancel); 

     if(mbr == MessageBoxResult.OK) 
     { OK pressed } 
     else 
     { Cancel pressed } 

    }); 

對於WinRT的一部分 -

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; 
    dispatcher.RunAsync(CoreDispatcherPriority.Normal, async()=>{ 
      // UI code goes here 
      //Declaration of variables 
     MessageDialog MDialog = new MessageDialog(text, title); 
     await MDialog.ShowAsync(); 
    }); 
+0

完美!但是這段代碼給了我一個小小的錯誤...錯誤:「對象引用沒有設置和對象的實例」 這是一個密封的類,沒有構造函數methods.Any idea?謝謝大家! – 2014-09-08 07:38:00

+0

在哪一行? – loop 2014-09-08 09:23:02

+0

我更新了ans檢查它。 – loop 2014-09-08 09:34:23

0

我的最終代碼:

private void DoSincroFit() 
    { 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 

     //Add headers to request 
     request.Headers["Type"] = "sincrofit"; 
     request.Headers["Device"] = "1"; 
     request.Headers["Version"] = "0.000"; 
     request.Headers["Os"] = "WindowsPhone"; 

     request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
    } 

    public async void playResponseAsync(IAsyncResult asyncResult) 
    { 
     //Declaration of variables 
     HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

     try 
     { 
      string fileName = "sincrofit.rar"; 

      using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) 
      { 
       byte[] buffer = new byte[1024]; 
       var newZipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

       using (var writeStream = await newZipFile.OpenAsync(FileAccessMode.ReadWrite)) 
       { 
        using (var outputStream = writeStream.GetOutputStreamAt(0)) 
        { 
         using (var dataWriter = new DataWriter(outputStream)) 
         { 
          using (Stream input = webResponse.GetResponseStream()) 
          { 
           var totalSize = 0; 
           for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length)) 
           { 
            dataWriter.WriteBytes(buffer); 
            totalSize += size; //get the progress of download 
           } 
           await dataWriter.StoreAsync(); 
           await outputStream.FlushAsync(); 
           dataWriter.DetachStream(); 
          } 
         } 
        } 
       } 

      } 
     } 
     catch 
     { 
      dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; //CRASH IN THIS LINE! 
      dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       //Declaration of variables 
       SMethods.Message_Dialog("Download has stopped!", "Error"); 
      }); 
     } 
    } 

這是我的照片:

enter image description here 謝謝大家!