2015-11-15 9 views
6

スレッドがVS C#2015デバッガを使用してスレッドプールに戻ったかどうかを確認する方法はありますか?スレッドプールに返されたスレッドがあるかどうかを確認する

私の場合、問題は、行ごとにデバッグすることで検出できないという事実です。スレッド2000上で実行されているtestAsyncの最初の行で

async Task foo() 
{ 
    int y = 0; 
    await Task.Delay(5); 
    // (1) thread 2000 returns to thread pool here... 
    while (y<5) y++; 
} 

async Task testAsync() 
{ 
    Task task = foo(); 
    // (2) ... and here thread 2000 is back from the thread pool, to run the code below. I want 
    // to confirm that it was in the thread pool in the meantime, using debugger. 
    int i = 0; 
    while (i < 100) 
    { 
     Console.WriteLine("Async 1 before: " + i++); 

    } 
    await task; 
} 

fooが呼び出されます。 await Task.Delay(5)が発生すると、スレッド2000はスレッドプールに戻ります(これを確認しようとしています)、メソッドはTask.Delay(5)が完了するまで待機します。その間、制御は呼び出し元に戻り、testAsyncの最初のループもスレッド2000で実行されます。

コードの2つの連続する行の間に、スレッドはスレッドプールに戻ってそこから戻ってきました。デバッガでこれをどのように確認できますか?おそらくスレッドのデバッガウィンドウですか?それはawait Task.Delay(5)に当たると

  1. 非常用スレッドプールにスレッド2000戻り、:fooは、2つの可能なシナリオがありますスレッド2000上で実行されている:私が求めているものを、もう少し明確にするために

    短い時間であり、スレッドプールから取り出されたスレッド2000上で実行される(2)行の呼び出し元に制御が戻されます。これが当てはまる場合は、スレッド2000がコードの2つの連続する行の間のの間にスレッドプール内にあったため、簡単に検出できません。

  2. それはawait Task.Delay(5)をヒットすると、スレッド2000は、スレッドプールに戻りますが、すぐにライン(2)から始まるtestAsyncでコードを実行していない

私は本当に何が起こっているその1検証したいと思います。

+0

'await Task.Delay(5);'の代わりに 'await Task.Yield();'を試してください。 –

+0

@IvanStoev違いはありません。実行されるスレッドを変更したり、スレッドのデバッグウィンドウで別のやり方で動作したりしません。 – user4205580

+5

なぜあなたは知る必要がありますか? – Enigmativity

答えて

関連する問題