C# Windows 窗体 - 正常将过滤器应用于图像,但使用线程 [duplicate] 获得 NullReferenceException

C# Windows Form - Apply filter to image normally but got NullReferenceException using Thread [duplicate]

提问人:Jack.Hou 提问时间:12/7/2020 更新时间:12/7/2020 访问量:123

问:

我正在对多个图像应用滤镜,它运行良好,但速度非常慢。

(注意:图像、过滤器、filter_size、div 已加载并分配)

for (int i = 0; i < 5; i++)
    out[i] = MyFiltering((Bitmap)images[i], filter, filter_size, div);

因此,我尝试为每个图像过滤使用一个线程来加速,如下所示:

for (int i = 0; i < 5; i++)
{
    FilterThread[i] = new Thread(() => {out[i] = MyFiltering((Bitmap)images[i], filter, filter_size, div)}
    FilterThread[i].IsBackground = true;
    FilterThread[i].Start();
}

我尝试了不同的方法(例如,ThreadPool、Task.Factory.StartNew),但总是在 MyFiltering 中为输入 img(即 images[i])获取 NullReferenceException,这绝对不是 NULL!

有人有想法吗?

C# 多线程 WinForms 筛选 NullReferenceException

评论

0赞 Enigmativity 12/7/2020
是什么类型?images
2赞 madreflection 12/7/2020
i被 lambda 捕获,因此它被推进到未初始化的元素,该元素现在由该线程引用,而不是预期的线程。参见 J. Steen 的答案iCopy
0赞 Martheen 12/7/2020
另一种方法是使用 Parallel.For learn.microsoft.com/en-us/dotnet/standard/parallel-programming/...或Select learn.microsoft.com/en-us/dotnet/api/...。
0赞 Jack.Hou 12/7/2020
谢谢大家。我尝试了iCopy方法但失败了,也许是我用错了方法,然后Parallel.For成功了!多谢!

答: 暂无答案