这是我进入异步/线程的第一步,所以提前道歉。我需要一些关于实施以下内容的最佳方法的建议......
我有一个包含进度条的非静态窗体。我还有一个静态方法“HttpSocket”来管理异步 http 下载。因此,我无法直接从静态方法访问表单进度条。
所以我想到了使用 backgroundWorker 来运行作业。但是,因为 DoWork 也在调用异步方法,所以一旦发出所有 http 请求,backgroundWorker 就会报告完成,但我想根据接收到 http 响应和解析数据的时间来更新进度条。
我想出的一种糟糕的解决方法如下
private void buttonStartDownload_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
并在 backgroundWorker1_DoWork 中放置一个 while 循环来比较请求/响应
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Trigger Asynchronous method from LoginForm
DataExtract LoginForm = new DataExtract();
LoginForm.DELogin();
//Without While Loop backgroundWorker1 completes on http requests and not responses
// Attempt to Monitor Progress of async responses using while loop
// HttpSocket method logs RequestCount & ResponseCount
while (HttpSocket.UriWebResponseCount < HttpSocket.UriWebRequestCount)
{
if (HttpSocket.UriWebResponseCount % updateInterval == 0)
{
int myIntValue = unchecked((int)HttpSocket.UriWebResponseCount / HttpSocket.UriTotal);
backgroundWorker1.ReportProgress(myIntValue);
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Change the value of the ProgressBar to the BackgroundWorker progress.
progressBar1.Value = e.ProgressPercentage;
}
但是,我意识到这不是最好的方法,因为 While 循环会影响性能并减慢通常很快但没有显示进度的异步过程。我正在寻求有关完成此任务的正确、最有效方法的建议,或者提供替代方法来从单独的异步线程更新表单进度条,无论是否使用 C#4.0 的 BackgroundWorker?
谢谢
○