2

デリゲートの実行中にコンテキストスイッチが実行中のスレッドを切り替えることは可能ですか?

このスニペットをLinqPadで数回試しましたが、new Exception()ラインにヒットしません。これは、元のスレッドで続行されることを示しているようですが、ここでの私の小さなテストでは、これをテストするには不十分かもしれません。

void Main()
{
    var list = Enumerable.Range(1,100000);
    list.AsParallel().ForAll( i=>
    {
        var threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
        System.Threading.Thread.Sleep(0); // allow a context switch
        work(i,threadId); 
    });
    "Complete".Dump();
}

void work(int num,int threadId)
{
    var currentId = System.Threading.Thread.CurrentThread.ManagedThreadId;
    if(threadId!=currentId)
    {
        throw new Exception();
    }
}
4

2 に答える 2

3

タスクがスケジュールされると、タスクに割り当てられた最初のスレッドが常に永久に使用されます。そのスレッドは実行を停止し、別のスレッド(スレッドプールからかどうかに関係なく)に何らかの作業を行わせる可能性があります。また、プロセス全体を停止して別のプロセスに作業を行わせることもできますが、常にスレッドに戻ることになります。あなたはで始めました。

于 2012-04-11T19:14:37.207 に答える
2

いいえ-同じメソッドが1つのスレッドで実行を開始し、別のスレッドで終了することはできません。考えてみてください。各スレッドには独自のスタックがあり、可能であれば、各コンテキストスイッチはスタックをコピーします。

あなたの例では、コンテキストスイッチ後のタイムスライスは別のスレッドに与えられますが、別のコードを実行します。その別のコードが同じメソッド内にある可能性がありますが、呼び出しスタックは他のものでありthreadiId、同様に他のものになります。

したがって、例外が表示されることはありません。

于 2012-04-11T19:19:34.723 に答える