我应该如何加载一次图像并在多线程C#应用程序中传递它?

我正在编写一个应用程序,其目的是在文件夹中查找图像并将其呈现给用户,询问如何裁剪它们.随着我每天从语言到语言的所有跳跃,我倾向于让我的最佳实践和概念混乱,这就是这种情况.

程序流程如下:您将看到主窗体,带有浏览按钮(您也可以将文件夹放到其上).当您选择一个文件夹时,它会打开另一个表单,扫描所选文件夹中的.jp [e] g和.tif [f]图像,并将它们显示在列表中,询问您要裁剪哪些文件,以及其他一些图像选项.然后它返回到主窗体,该窗体通过该窗体中选定图像的列表,并在每个窗体中将它加载到裁剪形式的BackgroundWorker中,然后裁剪并保存它.

对于原型设计,我处理的图像有点混乱;它将所有图像加载到选择表单的文件夹中,然后逐个在裁剪器中再次加载每个选定的图像,然后在主表单中再次加载并保存.对于大型图像,这可能会使任务耗费时间,因为在最坏的情况下,此应用程序将处理高达约4000px2的TIFF源图像.

我想有一种方法可以将每个Bitmap加载到某种全局数组中,但这将是Visual Basic或VB for Applications.由于我使用的是BackgroundWorker,我还要担心线程的安全性以及C#是否会对我试图以不安全的方式访问某些内容而大喊大叫.关于如何在限制单个图像加载到Bitmap对象中的次数的同时实现应用程序目的的任何想法?

最佳答案 由于根据
Microsoft,Bitmap类实例成员不保证是线程安全的,我看到2个选项:

>高效但有点冒险
将所有内容作为Bitmap对象加载并将所有这些Bitmap对象添加到ConcurrentDictionary …访问是线程安全且非常快,因为实现主要是无锁的…
>性能稍差但没有风险
将所有文件作为MemoryMappedFile加载到ConcurrentDictionary中.当您需要一个Bitmap时,您只需创建一个MemoryMappedFile(它将使用您之前创建的onece已经占用的相同内存,因此非常快)并让Bitmap从那里加载其内容…当你的应用程序关闭或你想要清理时,你只需浏览字典并删除那些MemoryMappedFile对象……

点赞