我目前正在尝试创建一个 FileViewer 控件,在我将项目(带有图标的文件名、大小等)添加到我的 ListView(图标 - 文件名 - 扩展名 - 大小)之后,我还检查文件是否是图像(png /jpg 等),但我在不同的线程上执行此操作。
我对线程的期望是它在主应用程序旁边运行,但是在我添加了所有文件之后,我启动了这个线程。它检查 ListView 中的所有文件并为它们创建缩略图。如果操作正确,ListView 图标在加载时应该一个接一个出现 - 但它们不是。它们都同时出现。
...当线程处于活动状态时,我什么也做不了。
为什么会发生这种情况,我做错了什么?我之前处理过线程并且它总是有效的,我使用回调调用该方法。
线程流:
- 格式文件键 = "C:\image.png" = "C_image_png"。
- 检查图像的缩略图是否存在(通过检查它的键),然后使用它
- 否则使用 Image.FromFile().GetThumbnailImage() 加载缩略图,并将带有 Key 的图像添加到 Listview 的图像
- 最后更改 ListView 项的 ImageKey。
全部在一个线程中完成。
private void GetFiles()
{
// Load all files in directory
Thread t = new Thread(new ThreadStart(GetImageFiles));
t.Priority = ThreadPriority.Lowest;
t.Start();
}
delegate void GetImageFilesCallback();
private void GetImageFiles()
{
if (this.IsHandleCreated)
{
if (files.InvokeRequired)
{
GetImageFilesCallback callback = new GetImageFilesCallback(GetImageFiles);
this.Invoke(callback);
}
else
{
string extension = "";
string key = "";
foreach (string file in _files)
{
extension = FileManager.GetExtension(file);
key = (DirectoryCurrent + file).Replace(":", "").Replace("\\", "_").Replace(".", "_");
foreach (string knownimages in _knownImageTypes)
{
if (extension.ToLower() == knownimages)
{
foreach (ListViewItem item in files.Items)
{
if (item.Text == file)
{
if (files.SmallImageList != null)
{
if (files.SmallImageList.Images[key] == null)
{
files.SmallImageList.Images.Add(key, Image.FromFile(DirectoryCurrent + file).GetThumbnailImage(16, 16, null, IntPtr.Zero));
files.LargeImageList.Images.Add(key, Image.FromFile(DirectoryCurrent + file).GetThumbnailImage(32, 32, null, IntPtr.Zero));
}
files.Items[item.Index].ImageKey = key;
}
}
}
}
}
}
files.Refresh();
}
}
}