2012-11-15 31 views
0

我遇到AsyncCallback函数的问题。我正在使用一个下载数据,然后在我做之后,它会抛出一个不同的异常。有些代码:AsyncCallback之后的异常

private void downloadBtn_Click(object sender, RoutedEventArgs e) 
{ 
    string fileName = System.IO.Path.GetFileName(Globals.CURRENT_PODCAST.Title.Replace(" ", string.Empty)); 
    MessageBox.Show("Download is starting"); 
    file = IsolatedStorageFile.GetUserStoreForApplication(); 
    streamToWriteTo = new IsolatedStorageFileStream(fileName, FileMode.Create, file); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(Globals.CURRENT_PODCAST.Uri)); 
    request.AllowReadStreamBuffering = false; 
    request.BeginGetResponse(new AsyncCallback(GetData), request); 
} 

private void GetData(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 
    Stream str = response.GetResponseStream(); 
    byte[] data = new byte[16* 1024]; 
    long totalValue = response.ContentLength; 
    while (str.Read(data, 0, data.Length) > 0) 
    { 
     if (streamToWriteTo.CanWrite) 
      streamToWriteTo.Write(data, 0, data.Length); 
     else 
      MessageBox.Show("Could not write to stream"); 
    } 
    streamToWriteTo.Close(); 
    MessageBox.Show("Download Finished"); 
} 

有没有办法告诉当一个异步回调完成,再没有崩溃运行代码,或什么我做错了什么?

+0

你肯定在那里做错了什么。您的读/写循环可能会写入太多的数据。例如,您的循环总是以16千字节的块写入。所以即使你只下载23个字节,也会写满16KB。此外,您永远不会关闭响应或响应流。这几乎肯定会导致问题。如果您需要更具体的建议,您需要告诉我们您得到的例外情况。 –

+0

我结束得到的回应,如果这是你的意思?:HttpWebResponse响应=(HttpWebResponse)request.EndGetResponse(result); – AllFallD0wn

+0

看看'HttpWebResponse.Close'和'Stream.Close'。 –

回答

2

问题是您从线程池线程调用MessageBox.Show。你需要从UI线程调用它。要做到这一点,你需要与UI线程同步。例如:

this.Invoke((MethodInvoker) delegate 
    { MessageBox.Show("success!"); }); 

Invoke的调用将在UI线程上执行代码。有关更多信息,请参阅Control.Invoke的文档。

+0

错误背后的理论是正确的,当我使用表格应用程序时,这将是完美的,所以我标记了正确的答案。要修复的实际代码是(Windows Phone 7):Dispatcher.BeginInvoke(delegate {ShowCompletionMessage();}); - 非常感谢! – AllFallD0wn

相关问题