0
나는 Download
방법을 가지고 ProgressChangedEventArgs
은 Progress
속성을 가지고 있습니다. Download
메서드는 UI를 응답 성있게 유지하려면 비동기 적이어야합니다. 그래서 아래 코드를 준비했는데 Form.cs
에 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를 대신
HttpWebRequest
오히려 구식의HttpClient
를 사용할 수 있습니다 'Task.Run' 대신에. –