0

並列実行のためのバッファリング サンプルの最適化に基づいて、この質問が発生しました。

要するに:

このコードは、別のスレッドの要素にアクセスできないという多くの例外をスローします。空のファイル名を作成し、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にはローカル変数を使用します。これは、これら2つの変数がスレッド間で共有され、別のスレッドが実行を開始すると、1つのスレッドのNummerierungとEnkodierungが上書きされる可能性があるためです。

于 2013-01-17T22:18:51.953 に答える