6

それぞれ約1MBの写真を約20枚含む「画像」のリストがあります。次のボタンをクリックして、リスト内の画像をスクロールしたいと思います。しかし、約8枚の写真の後、私は記憶から抜け出します。

    private void button4_Click(object sender, EventArgs e) //next
    {
        index++;
        if (index >= images.Count) index = 0;
        CurrImage = images[index]; 
        Bitmap b = new Bitmap((Bitmap)CurrImage.Clone()); //breakpoint occurs her
        pictureBox1.Image = b; 

        NewThread = new Thread(new ThreadStart(ChooseColors2));
    }

ChooseColors2スレッドは「CurrImage」を使用するため、競合状態を回避するために、上記のように新しいビットマップを作成することで競合状態を回避しました。

私がpictureBox1.Image=CurrImage;を使用する場合は、注意してください。新しいビットマップを作成せずにこのエラーは発生しませんが、スレッドで競合状態の例外が発生します。

4

2 に答える 2

4

新しいビットマップをに割り当てる前に、次の呼び出しを試してpictureBox1.Image、以前の「新しい」ビットマップを削除し、リソースを解放することができます。

pictureBox1.Image.Dispose();
于 2013-03-19T03:41:53.297 に答える
0

usingキーワードを活用することもできると思います。オブジェクトがスコープの直後に配置されるようにするためです。あなたはそれをこのようにすることができます:

using (Bitmap b = new Bitmap((Bitmap)CurrImage.Clone()))
{
    pictureBox1.Image = b;
}`

詳細については、C#での「使用」の使用法をご覧ください。

于 2019-01-16T10:18:51.613 に答える