これは非同期/スレッド化への私の最初のステップなので、事前にお詫びします。以下を実装するための最良の方法についてアドバイスが必要です...
プログレスバーを含む非静的なウィンドウフォームがあります。非同期httpダウンロードを管理するための静的メソッド「HttpSocket」もあります。したがって、静的メソッドからフォームの進行状況バーに直接アクセスすることはできません。
そこで、backgroundWorkerを使用してジョブを実行することを考えました。ただし、DoWorkは非同期メソッドも呼び出しているため、すべてのhttpリクエストが行われるとbackgroundWorkerレポートが完了しますが、http応答が受信され、データが解析された時期に基づいて進行状況バーを更新したいと思います。
私が思いついたこれを回避する1つのひどい方法は次のとおりです
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の有無にかかわらず、別の非同期スレッドからフォームプログレスバーを更新する別の方法を提案した後です。
ありがとうございました
O