2017-04-07 11 views
1

ProcessAsyncが現在実行中のASP.NET Webサーバースレッドプールの作業を外していることを示すために、デモンストレーションをまとめようとしています。私は気象サービスを呼び出す簡単な例を書いた。残念ながら、threadIdは変更されません。ASP.NETコアでスレッドの変更を強制する方法タグヘルパーのProcessAsync

私は理解できない場合があります。したがって、2つの質問:

1:これを正しく実行していますか?ThreadIdBeforeとThreadIdAfterは異なるはずですか?

2:これを正しく行っていると仮定すると、デモに新しいスレッドIDを表示させるためにできることはありますか?

namespace WebAppTagHelper.TagHelpers 
{ 
    public class MyTestTagHelper : TagHelper 
    { 
     private static HttpClient _httpClient = new HttpClient(); 

     string requestUrl = "http://samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=b1b15e88fa797225412429c1c50c122a1"; 
     public override async Task ProcessAsync(
      TagHelperContext context, TagHelperOutput output) 
     { 
      var threadIdBefore = Thread.CurrentThread.ManagedThreadId; 
      var uri = new Uri(requestUrl); 
      using (var response = await _httpClient.GetAsync(uri)) 
      { 
       response.EnsureSuccessStatusCode(); 

       var result = await response.Content.ReadAsStringAsync(); 

       JObject json = JObject.Parse(result); 
       if (result != null) 
       { 
        output.Attributes.Add("class", "highlight"); 
        var threadIdAfter = Thread.CurrentThread.ManagedThreadId; 
        output.Content.SetHtmlContent(
         string.Format("<b>Thread ID Before: {0} After: {1}</b>", threadIdBefore, threadIdAfter)); 

       } 

      } 

     } 
    } 

} 
+0

非同期メソッドは、使用可能な最初のスレッドで実行を継続しますが、最初のスレッドは同じになっています。複数のリクエストを同時に送信することで、これを実現できます。 – Fabio

答えて

3

私はこれを正しくやっていると私はThreadIdBeforeとThreadIdAfterは/異なる場合があります必要があることを期待できますか?

いいえ「前」と「後」の間にはawaitがありません。スレッドが変更される可能性はありません。

+0

Thanks @ stephen-cleary Good catch。私はソースを修正し、結果として同じthreadIdを取得します。あなたが考えることができる新しいスレッドにそれを強制的にまっすぐ進む方法? –

+0

'Task.Run'以外は?なぜあなたはしたいですか? –

+0

教えてください。アクティブなWebスレッドプール外のスレッドで非同期作業が行われていることをどのように表示できますか。 –

関連する問題