使用c#异步处理Bitmap对象

Ker*_*rer 3 multithreading asynchronous image-processing thread-safety

我正在尝试在多个线程中处理位图对象.我在UI线程中创建对象,并希望异步保存它.调用save方法后,我继续处理位图并以多种方式对其进行操作.

当主线程修改位图时,异步线程抛出错误或破坏流.我尝试使用async/await和ThreadStart实现,两个结果都是一样的.

我已经能够通过复制位图流并将新流发送到异步方法来解决这个问题,但这会降低性能.复制它几乎需要一半的时间来保存它,特别是在处理大流时.

我想知道是否有人为此方案有解决方法.

Han*_*ant 6

我假设这个问题与System.Drawing.Bitmap类有关.几乎所有位图上的非平凡操作都会调用相当于Bitmap.LockBits()的内容.这包括Image.Save(),Graphics.FromImage(),Bitmap.SetPixel()等.此锁定一次只能由一个线程保存.尝试锁定位图的任何其他线程都将触发异常.

因此,完全取决于您确保没有两个线程可以同时访问位图.换句话说,您必须lock在代码中使用关键字以确保在使用位图时阻止线程.请注意您将从中获得的并发性不可避免的丢失,如果您的工作线程正好想要同时绘制位图,那么您的UI线程将会停止,而您的工作线程会修改位图.

请注意,这并不总是可行的.例如,您无法更改PictureBox类以插入所需的内容lock.BackgroundImage属性的相同故事.等等.结果是你不能再使用这些便利类/属性了,你必须自己画画,这样你才能插入锁.