在Windows Phone 8.1的后台任务中显示对话框的问题

我有这个代码执行httpwebrequest和响应在后台方法,我只是想显示对话框的信息,当下载邮编崩溃,我的代码进入这个catch …

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(); 

这在后台任务等待…有人可以帮助我吗? 有可能使用事件处理程序? 为什么? 怎么样? 提前致谢!

Solutions Collecting From Web of "在Windows Phone 8.1的后台任务中显示对话框的问题"

Merli你的问题是你正试图从背景胎面访问UI线程显示对话框用户所以使用Dispatcher这个基本的例子是:

 // 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(); }); 

解决了,我的最终代码在这里:

  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!

我的最终代码:

  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"); }); } } 

这是我的照片:

在这里输入图像说明 感谢所有!