Похоже, что ваши BackgroundWorkers пытаются получить доступ к одним и тем же компонентам Windows Forms одновременно. Это объясняет, почему сбой является случайным.
Вам нужно убедиться, что этого не произойдет, используя lock
, возможно, так:
private object lockObject = new object();
algo1backgroundworker_DoWork()
{
Image imgclone;
lock (lockObject)
{
Image img = this.picturebox.Image;
imgclone = img.clone();
}
//operate on imgclone and output it
}
Обратите внимание, что я удостоверяюсь, что imgclone является локальным для этого метода - вы определенно не хотите делиться им между всеми методами!
С другой стороны, один и тот же экземпляр lockObject используется всеми методами. Когда метод BackgroundWorker входит в свой раздел lock{}
, другие, которые приходят к этому моменту, будут заблокированы. Поэтому важно убедиться, что код в заблокированном разделе быстрый.
Когда вы начинаете «выводить» обработанное изображение, будьте осторожны, чтобы не допустить сквозного обновления пользовательского интерфейса. Проверьте этот пост для аккуратного способа избежать этого.