以下のように、backgroundworker do_dowork イベントによって返される進捗状況を示すプログレスバーがあります。
if (ftpSourceFilePath.Scheme == Uri.UriSchemeFtp)
{
FtpWebRequest objRequest = (FtpWebRequest)FtpWebRequest.Create(ftpSourceFilePath);
NetworkCredential objCredential = new NetworkCredential(userName, password);
objRequest.Credentials = objCredential;
objRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse objResponse = (FtpWebResponse)objRequest.GetResponse();
StreamReader objReader = new StreamReader(objResponse.GetResponseStream());
int len = 0;
int iProgressPercentage = 0;
FileStream objFS = new FileStream((cd+"\\VolareUpdate.rar"), FileMode.Create, FileAccess.Write, FileShare.Read);
while ((len = objReader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
objFS.Write(buffer, 0, len);
iRunningByteTotal += len;
double dIndex = (double)(iRunningByteTotal);
double dTotal = (double)buffer.Length;
double dProgressPercentage = (dIndex / dTotal);
iProgressPercentage = (int)(dProgressPercentage);
if (iProgressPercentage > 100)
{
iProgressPercentage = 100;
}
bw.ReportProgress(iProgressPercentage);
}
}
ただし、プログレスバーは更新されません。検索中に、UIスレッドがブロックされていると言われ、ループの外に進行状況を渡すとうまくいくと思いました。それから私はこれに変わります
if (ftpSourceFilePath.Scheme == Uri.UriSchemeFtp)
{
FtpWebRequest objRequest = (FtpWebRequest)FtpWebRequest.Create(ftpSourceFilePath);
NetworkCredential objCredential = new NetworkCredential(userName, password);
objRequest.Credentials = objCredential;
objRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse objResponse = (FtpWebResponse)objRequest.GetResponse();
StreamReader objReader = new StreamReader(objResponse.GetResponseStream());
int len = 0;
int iProgressPercentage = 0;
FileStream objFS = new FileStream((cd+"\\VolareUpdate.rar"), FileMode.Create, FileAccess.Write, FileShare.Read);
while ((len = objReader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
objFS.Write(buffer, 0, len);
iRunningByteTotal += len;
double dIndex = (double)(iRunningByteTotal);
double dTotal = (double)buffer.Length;
double dProgressPercentage = (dIndex / dTotal);
iProgressPercentage = (int)(dProgressPercentage);
if (iProgressPercentage > 100)
{
iProgressPercentage = 100;
}
// System.Threading.Thread.Sleep(2000);
iProgressPercentage++;
// SetText("F", true);
}
bw.ReportProgress(iProgressPercentage);
progressBar.Refresh();
}
しかし、それでも役に立ちませんでした。workerprogresschanged イベントにブレークポイントを設定すると、progressbar.value が表示されますが、更新されません。私はprogressbar.update(0を試しました。また、ループ内でしばらくスレッドをスリープさせようとしましたが、それでも解決しませんでした。提案/ヘルプをいただければ幸いです。