この2つの方法では、GetDirectoriesとMyGetDirectoriesはすべてのディレクトリとサブディレクトリを再帰的に取得しています。私は、ラベルの終わりまでディレクトリの数を数えるカウンタのように、progresschangedイベントのlabel2に表示したいと思います。ディレクトリの数をリアルタイムでbackgroundworker progresschangedイベントに報告するにはどうすればよいですか?
private void _FileInformationWorker_DoWork(object sender, DoWorkEventArgs e)
{
MySubDirectories = GetDirectories(BasePath).ToArray();
}
private void _FileInformationWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
その後GetDirectoriesメソッド
private List<DirectoryInfo> GetDirectories(string basePath)
{
IEnumerable<string> str = MyGetDirectories(basePath);
List<DirectoryInfo> l = new List<DirectoryInfo>();
l.Add(new DirectoryInfo(basePath));
IEnumerable<DirectoryInfo> dirs = str.Select(a => new DirectoryInfo(a));
l.AddRange(dirs);
return l;
}
そしてメソッドMyGetDirectories
private static IEnumerable<string> MyGetDirectories(string basePath)
{
try
{
string[] dirs = Directory.GetDirectories(basePath);
return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir)));
}
catch (UnauthorizedAccessException)
{
return Enumerable.Empty<string>();
}
}
私が試したことは、私は、変数countDirectoriesと呼ばれるカウンタを追加し、私はそれがない確認方法MyGetDirectoriesでありますカウント。
static int countDirectories = 0;
private static IEnumerable<string> MyGetDirectories(string basePath)
{
try
{
string[] dirs = Directory.GetDirectories(basePath);
countDirectories = countDirectories + dirs.Length;
return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir)));
}
catch (UnauthorizedAccessException)
{
return Enumerable.Empty<string>();
}
}
私がやったDoWorkイベントで、その後
:
private void _FileInformationWorker_DoWork(object sender, DoWorkEventArgs e)
{
MySubDirectories = GetDirectories(BasePath).ToArray();
_FileInformationWorker.ReportProgress(0,countDirectories.ToString());
}
そしてprogresschangedイベントで
private void _FileInformationWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label2.Text = e.UserState.ToString();
}
しかし、それはまだ内部で働いているので、私は推測LABEL2何にも報告していませんGetDirectoriesメソッド。だから私はここで立ち往生している。
shibormotありがとう私は答えとしてマークします。別の質問がありますが、新しい質問を開くかどうかはわかりません。ディレクトリ数の報告が今行われています。しかし、ディレクトリMySubDirsにディレクトリをリアルタイムで報告したいのであればどうでしょうか?私は今あなたのコードで私のコードで私たちはMySubDirsがnullではなく、内部のディレクトリを終了するディレクトリを取得するのを待つ必要があることを意味します。しかし、私はMySubDirsを扱うために別のバックグラウンドワーカーを使用しています。 –
MysubDirsにすでにあるディレクトリを報告し、埋め尽くしているかもしれません。私がやっていることは、別のバックグラウンドワーカーのMySubDirsのディレクトリをループして、MySubDirsにあるこのディレクトリを検索することです。最初のバックグラウンドワーカーがプロセスを終了する前に、2番目のバックグラウンドワーカーを開始してMySubDirsで作業するにはどうすればいいのでしょうか。 –
短い質問ではないので、新しい質問をする方が良い – shibormot