0

基于Optimizing a buffering sample for parallel execution,这个问题出现了。

简而言之:

这段代码抛出了很多无法访问另一个线程的元素的异常。它创建空文件名并跳过每 3 个左右的数字。

目标是在将字节数组并行转换为图像时不要混淆编号(Nummerierung)。有关说明,请参阅链接。

我需要改变什么?

Action action = () =>
{
    ArrayAnsammlung.TryTake(out data);
    if (data != null)
    {
        Nummerierung = Convert.ToString(Interlocked.Increment(ref Nummerierungszaehler));
        Enkodierung = null;
        Enkodierung = new JpegBitmapEncoder();
        Enkodierung.FlipHorizontal = true;
        var dateiStrom = new FileStream("E:\\Temp\\" + datum + " " + Nummerierung.PadLeft(12, '0') + ".jpg", FileMode.Create);
        Enkodierung.Frames.Add(BitmapFrame.Create(BitmapSource.Create(bildbreite, bildhoehe * 2,
        96, 96, PixelFormats.Bgr32, null, data, stride)));
        Enkodierung.Save(dateiStrom);
        dateiStrom = null;
        Enkodierung = null;
    }
};

while (aufnahme)
{
    try
    {
        Parallel.Invoke(action, action, action, action, action);
    }
    catch (AggregateException oo)
    {
        Console.WriteLine(oo.ToString());
    }
    Thread.Sleep(2000);
}
4

1 回答 1

0

对 Nummerierung 使用本地字符串,对 Enkodierung 再次使用本地变量,因为这两个变量在您的线程之间共享,如果另一个线程开始执行,一个线程的 Nummerierung 和 Enkodierung 可能会被覆盖。

于 2013-01-17T22:18:51.953 回答