【发布时间】:2023-03-24 22:19:01
【问题描述】:
一、代码:
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 和 _fileIndex 因为我想添加一些 Left 和 Right 键功能来在照片之间切换,所以我必须访问其他地方(但在 UI 线程中)。
这样安全吗?现在C#中处理线程的方法似乎有几十种,我只是想要一些简单的东西。
fileName 是一个局部变量(这意味着它将被“复制”到匿名函数中,对吗?),而_searchOption 是只读的,所以我想这两个是可以安全访问的。
【问题讨论】:
标签: winforms multithreading thread-safety thread-abort