1
if (Int32.Parse(strTotals) == 0 && nTotalCount != 0)
{
    nTotalCount = 0;
    for (int j = 0; j < 66; j++)
    {
        if (GameHistoryPicBox1[j].InvokeRequired)
        {
            GameHistoryPicBox1[j].BeginInvoke(new MethodInvoker(() =>
            {
                if ((j + j / 6) % 2 == 0)
                    GameHistoryPicBox1[j].Image = Properties.Resources.al1;  // Line2
                else
                    GameHistoryPicBox1[j].Image = Properties.Resources.al2;  // Line4
            }));
        }
        else
        {
            if ((j + j / 6) % 2 == 0)
                GameHistoryPicBox1[j].Image = Properties.Resources.al1;
            else
                GameHistoryPicBox1[j].Image = Properties.Resources.al2;
        }
    }
}

nTotalCountスレッドを使用して値を確認しています。

がゼロの場合nTotalCount、すべてのゲームの画像ボックスの画像を消去する必要があります。

だから私は上記のコードを実装しました。

残念ながら、エラーが発生しました:

タイプ 'System.IndexOutOfRangeException' の未処理の例外

2号線と4号線。

j値は でした66

j値がである可能性はあります66か?

4

3 に答える 3

2

変数はクロージャーに渡されます。呼び出しは非同期であるため、ループが完了したjのある時点で実際に実行されます。デリゲートが実行されたときにの値がどうなるかはわかりません。j

j次のように、 in の値をパラメーターとしてデリゲートに渡してみてください。

GameHistoryPicBox1[j].BeginInvoke(new Action<int>((x) =>
{
    if ((x + x / 6) % 2 == 0)
        GameHistoryPicBox1[x].Image = Properties.Resources.al1;
    else
        GameHistoryPicBox1[x].Image = Properties.Resources.al2;
}), j);
于 2013-10-31T16:42:06.847 に答える
2

これは、クロージャーの仕組みによるものです。MethodInvoker作成して参照変数に渡すラムダ式は、参照によってj変数を参照します。したがって、このコードが実行されているとき (非同期であるため、ほぼいつでも可能です)、変数は からまでjの任意の値を持つことができます。また、ループが終了した後でもかまいません。06666

簡単な修正は、次のコピーを作成することですj

int index = j;
GameHistoryPicBox1[index].BeginInvoke(new MethodInvoker(() =>
    {
        if ((index + index / 6) % 2 == 0)
            GameHistoryPicBox1[index].Image = Properties.Resources.al1;  // Line2
        else
            GameHistoryPicBox1[index].Image = Properties.Resources.al2;  // Line4
    }));

詳細については、こちらをご覧ください。

于 2013-10-31T16:42:30.990 に答える