0

簡単なコードを書きました

void go()
{
    int i = 5;
    ThreadPool.QueueUserWorkItem(delegate
    {
        for (int j = 1; j <= 1000; j++)
            Console.Write(i);
    });
    for (int k = 1; k <= 1000; k++)
        i = k;
    Console.ReadLine();
}

私が得たものは次のとおりです。100010001000100010001000....

理由がわかりません、誰かが私に説明してくれることを願っています、ありがとう!

4

2 に答える 2

3

に割り当てるループは、キューに入れられたスレッドが開始される前に実行されますki

したがって、キューに入れられたスレッドが開始された時点で、表示さiれる値1000があります。

于 2013-08-07T08:06:44.900 に答える
1

コードを次のように変更します

    void go()
    {
        int i = 5;
        int i1 = i; //note this
        ThreadPool.QueueUserWorkItem(delegate
        {
            for (int j = 1; j <= 1000; j++)
                Console.Write(i1); //and note this
        });
        for (int k = 1; k <= 1000; k++)
            i = k;
        Console.ReadLine();
    }

Resharper は「変更されたクロージャへのアクセス」を報告します。

于 2013-08-07T08:07:15.967 に答える