0
我有一個Download
方法和ProgressChangedEventArgs
攜帶Progress
屬性。 Download
方法必須異步以保持UI響應。所以我準備下面的代碼,但在Form.cs
調用e.Progress
時會拋出交叉線程操作異常。我在執行async
和await
時做錯了嗎?如何使用Form.cs中的異步方法內部引發的EventArgs而不調用?
在DownloadManager.cs
public async void DownloadProcedure(long contentLength)
{
await Task.Run(() =>
{
long totalBytesReceived = 0;
int bytesRead = 0;
byte[] buffer = new byte[10 * 1024];
HttpWebRequest req = url.CreateHttpWebRequest();
HttpWebResponse resp = req.GetHttpWebResponse();
Stream remoteStream = resp.GetResponseStream();
while ((bytesRead = remoteStream.Read(buffer, 0, buffer.Length)) > 0)
{
totalBytesReceived += bytesRead;
double newProgress = (totalBytesReceived * 100d/contentLength);
if (progress != newProgress && ProgressChanged != null)
{
ProgressChanged(this, new ProgressChangedEventArgs(progress));
}
}
});
}
在Form.cs
void Form1_Load(object sender, EventArgs e)
{
DownloadManager dm = new DownloadManager("http://download.thinkbroadband.com/20MB.zip", "");
long size = 0;
bool res = false;
dm.checkUrl(ref size, ref res);
dm.ProgressChanged += dm_ProgressChanged;
dm.DownloadProcedure(size);
}
void dm_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Text = e.Progress.ToString("0.00");
}
我怎樣才能解決這個問題呢?
最佳的解決方案是:1)使用'IProgress'和'進展',和2)使用異步的API而不是'Task.Run'。 –