0

私は長い間 .net Web アプリの開発経験がありますが、今日、データベースからのデータに基づいて Excel を作成するための Windows フォーム アプリを作成するように依頼されました。私は Windows フォームの専門家ではありません。

完了し、機能しています。プログラムが応答し続けることができるように、バックグラウンド ワーカーを使用してプログレス バーを追加しました。次に、OrderId に基づいて行の bgcolor を変更したいと思います。

以下を追加しました。

backgroundColor = backgroundColor == Color.White ? Color.WhiteSmoke : Color.White;

このコード行は、私の注文 foreach のすぐ下にあります。私の注文には多くの支払いなどが含まれる可能性があるため、1 つの注文に対して Excel の多くの行のようになります。

BackgroundWorker がなければ、すべてが意図したとおりに機能しますが、それを追加すると、スレッド内にあるため奇妙なことが起こるため、すべてが台無しになります。

私は自分自身をかなり明確にし、この「問題」に対する答えを見つけたいと思っています.

以下はバックグラウンド ワーカーのコードです。この CreateExcel メソッド内には注文に関する foreach がありますが、バックグラウンド ワーカーはスレッド化されており、個別の注文ごとに bgcolor を色付けするロジックが機能していません...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    Util.CreateExcel(_orders, _fileName, sender as BackgroundWorker, e);
}

いくつかの画像を投稿してみましたが、これにはもっと評判が必要です。

希望する結果は、「ゼブラ」のようなもので、注文ごとに bgcolor が異なります。backgroudworker がなければこれは正常に動作しますが、それを使用すると結果が奇妙になり、一部の注文は他の注文と同じ bgcolor になり、一部の注文は問題ありません。

4

1 に答える 1

0

色切り替えコードで競合状態が発生している可能性があります。

backgroundColor = backgroundColor == Color.White ? Color.WhiteSmoke : Color.White;

このコードは次のようになります。

if( backgroundColor == Color.White )
      backgroundColor = Color.WhiteSmoke;
else
      backgroundColor = Color.White;

2 つ以上のスレッドがIF コードとその条件を同時に通過する可能性があるため、2 つのスレッドがテストを行い、背景が白になったことをまったく同時に認識し、2 つの WhiteSmoke 行が生成される可能性があります。

これを解決する方法は、共有オブジェクト (フィールドなど) をロックすることにより、1 つのスレッドのみがこのブロックを排他的に実行できるようにすることです。

lock(syncLock)
{
    backgroundColor = backgroundColor == Color.White ? Color.WhiteSmoke : Color.White;
}
于 2013-08-30T17:04:55.630 に答える