0

2 つのスレッドがあり、それぞれが 2 つのスレッドを実行していますが、エラーは表示されません。しかし、一緒に実行すると、backgroundWorker2 のヒント: null を複製できません.....(変数 J の値が 100 より大きいことを確認します)。この場合、グローバル変数をロックするにはどうすればよいですか?

Bitmap img; //global variable
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int i = 0;
        do
        {
            img = (Bitmap)Image.FromFile(@"i:\1.jpg");
            img.Dispose();
            i++;
            backgroundWorker3.ReportProgress(i,"");
            Thread.Sleep(10);
        } while (!backgroundWorker4.CancellationPending);
    }

 private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        int j= 0;
        do
        {
            //img = (Bitmap)Image.FromFile(@"i:\1.jpg");

            if (img != null)
            {
                lock (img)
                {
                    Bitmap tempImg = (Bitmap)img.Clone();
                }
            }

            j++;
            backgroundWorker4.ReportProgress(j, "");
            Thread.Sleep(10);
        } while (!backgroundWorker4.CancellationPending);
    }
4

1 に答える 1

1

二重チェックのロックが必要なようです。これにより、null チェックとロックの間で、別のスレッドimgが null に設定されるシナリオ (つまり、競合状態) が回避されます。

if (img != null)
{
    lock (img)
    {
        if (img != null)
        {
            Bitmap tempImg = (Bitmap)img.Clone();
        }
    }
}
于 2013-09-13T01:41:27.520 に答える