C# windows phone 8.1中后台任务上显示对话框的问题
我有这个代码在后台执行httpwebrequest和response方法,我只想在下载zip崩溃时显示对话框以获取信息,我的代码输入到这个捕获C# windows phone 8.1中后台任务上显示对话框的问题,c#,windows,windows-phone-8,background,task,C#,Windows,Windows Phone 8,Background,Task,我有这个代码在后台执行httpwebrequest和response方法,我只想在下载zip崩溃时显示对话框以获取信息,我的代码输入到这个捕获 private void DoSincroFit() { HttpWebRequest request = HttpWebRequest.CreateHttp(url); request.BeginGetResponse(new AsyncCallback(playResponseAsync), reque
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();
这是在后台等待的任务。。。有人能帮我吗?是否有可能使用事件处理程序?为什么?怎么用?提前谢谢 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 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");
});
}
}
这是我的照片:
谢谢大家 已解决,我的最终代码如下:
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 太好了!但是这个代码给了我一个小错误。。。错误:“Object reference no set to and intance of a Object”这是一个密封类,没有构造函数方法。知道吗?谢谢大家!此代码不起作用,因为visual studio会告诉我:“实际上下文中不存在名称“部署”,当我使用visual studio帮助时,会导出此库:Windows.Phone.Management.Deployment.Current.Dispatcher.BeginInvoke。。。但视觉告诉我电流不存在,是一个错误。最后,MessageBox控件在Windows phone 8中不存在。泰克斯!您是为WP8.1 silverlight还是WP8.1 winrt模板开发的?第一个代码是:CoreDispatcher=CoreWindow.GetForCurrentThread().dispatcher;dispatcher.RunAsync(corespatcherpriority.Normal,async()=>{//变量声明SMethods.Message_对话框(“下载已停止!”,“错误”);});在调度程序上赋值时,第一行失败。谢谢allI,我不太清楚,抱歉,我是wp silverlight的新手开发者,它是nuguet软件包还是库?如果是,那么我使用winrt模板,我怎么知道这一点?谢谢大家!