2012-11-15 37 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

相關問題