まず、コード:
lblFileNbr.Text = "?/?";
lblFileNbr.ToolTipText = "Searching for files...";
lock(_fileLock)
{
_dirFiles = new string[0];
_fileIndex = 0;
}
if(_fileThread != null && _fileThread.IsAlive)
{
_fileThread.Abort();
}
_fileThread = new Thread(() =>
{
string dir = Path.GetDirectoryName(fileName) ?? ".";
lock (_fileLock)
{
_dirFiles = GetImageFileExtensions().SelectMany(f => Directory.GetFiles(dir, f, _searchOption)).OrderBy(f => f).ToArray();
_fileIndex = Array.IndexOf(_dirFiles, fileName);
}
int totalFileCount = Directory.GetFiles(dir, "*.*", _searchOption).Length;
Invoke((MethodInvoker)delegate
{
lblFileNbr.Text = string.Format("{0}/{1}", NumberFormat(_fileIndex + 1), NumberFormat(_dirFiles.Length));
lblFileNbr.ToolTipText = string.Format("{0} ({1} files ignored)", dir, NumberFormat(totalFileCount - _dirFiles.Length));
});
});
_fileThread.Start();
小さな画像表示プログラムを作成しています。画像を開くと、同じディレクトリ内のファイルの数が一覧表示されます。他の多くのファイル (たとえば 150K) を含むディレクトリで画像を開くと、ファイル リストの作成に数秒かかることに気付きました。したがって、このタスクを別のスレッドに委任しています。
ただし、ファイルの検索が完了する前に別の画像を開いた場合、その古いカウントはもはや関係ないため、スレッドを中止します。
写真を切り替えるためのいくつかの重要な機能を追加したいので、ロック_dirFiles
しています。そのため、別の場所 (ただし UI スレッド内) にアクセスする必要があります。_fileIndex
LeftRight
これは安全ですか?現在、C# でスレッドを処理する方法は数十あるようですが、単純なものが欲しかっただけです。
fileName
はローカル変数 (つまり、無名関数に「コピー」されるということですよね?) であり、_searchOption
読み取り専用であるため、これら 2 つは安全にアクセスできると思います。