私はDownload
メソッドを持ち、ProgressChangedEventArgs
はProgress
プロパティを持っています。 UIレスポンスを維持するには、Download
メソッドを非同期にする必要があります。だから私は以下のコードを用意しましたが、にe.Progress
を呼び出すと、クロススレッド操作の例外がスローされます。 async
とawait
の実装で間違っていますか? EventArgsを呼び出すことなくForm.csで非同期メソッド内で発生したEventArgsの使用方法
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");
}
Form.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));
}
}
});
}
DownloadManager.cs
ではどうすればこの問題を解決することができますか?
最善の解決策は、1にある) 'IProgress'と '進歩'、および2)を使用する非同期APIを使用します'Task.Run'の代わりに。 –