11

の目的はExecutionContext.SuppressFlow();何ですか? 次のコードでは、何が抑制されるのでしょうか?

私はこのテストコードを持っています...

protected void btnSubmit_Click(object sender, EventArgs e)
{
   Thread[] th = new Thread[100];
   Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");

   AsyncFlowControl cntrl = ExecutionContext.SuppressFlow();
   for (int i = 0; i < th.Length; i++)
   {                   
      th[i] = new Thread(new ParameterizedThreadStart(ThreadMethod));
      th[i].Name = "Thread #" + (i+1).ToString();                
      th[i].Start((i+1).ToString());
   }
   ExecutionContext.RestoreFlow();

   foreach (Thread t in th)            
   {
      t.Join();
   }
   Response.Write(response);
}


String response = null;
Random rnd = new Random(1000);
private void ThreadMethod(object param)
{   
   if (param != null)
   {
      string temp = param as string;
      if (temp != null)
      {
         //To test what is the current culture I get for this thread execution
         System.Globalization.CultureInfo info = Thread.CurrentThread.CurrentCulture;
         for (int i = 0; i <= 10; i++)
         {
            Thread.Sleep(rnd.Next(2000));
            response += Thread.CurrentThread.ManagedThreadId.ToString() + ":" 
                     + Thread.CurrentThread.Name + ": " + temp + "<br/>";
         }
      }
   }
}
4

4 に答える 4

11

ExecutionContext の詳細は非常にわかりにくく、.NET Remoting や WCF などの機能の奥深くに埋もれています。その一部は次のとおりです。

  • ホスト実行コンテキスト
  • IllogicalCallContext、Remoting によって使用されるスレッド固有のデータのリポジトリ
  • 上記の論理コンテキスト
  • SecurityContext
  • 同期コンテキスト

CultureInfo はその一部ではないため、メイン スレッドの既定のカルチャを変更すると、かなりの問題になる可能性があります。他のスレッドを切り替えるコードを明示的に記述しない限り、他のスレッドがそのカルチャで確実に実行されるようにする良い方法はありません。.NET はスレッドプール スレッドで非同期コールバックを実行する傾向があるため、これは必ずしも実用的ではありません。これらは、システムの既定のカルチャに初期化されます。

編集:この問題は、CultureInfo.DefaultThreadCurrentCulture プロパティを使用して .NET 4.5 で修正されました。

Edit2: .NET 4.6 でより徹底的に修正され、カルチャが期待どおりに流れるようになりました。

于 2009-12-23T11:08:20.780 に答える
11

実行コンテキスト。SuppressFlowは、非同期スレッド間の実行コンテキストの流れを抑制します。

親スレッドから子スレッドに暗黙的に渡される ExecutionContext は、実行の論理スレッドに関連する情報 (セキュリティ コンテキスト、呼び出しコンテキスト、および同期コンテキスト) を提供しますその情報が必須でない場合、実行コンテキストを省略すると、マルチスレッド アプリケーションのパフォーマンスが少し最適化されます。

実行コンテキスト。RestoreFlowは、スレッド間の実行コンテキストの通過を復元します。

ついに

Q :次のコードでは、何が抑制されますか??

A : セキュリティ コンテキスト、コール コンテキスト、および同期コンテキストの情報の通過は厳密に抑制されます。新しく作成されたスレッド間。なぜそれができたのですか?- th.Lengthで作成されたスレッドの作成と作業を最適化するため: スレッド間で渡される補足情報が少なくなり、このスレッドがスレッド間でより迅速に対話します。

于 2009-12-23T10:35:09.200 に答える
2

私はこれを読みました-「スレッドが作成されると、ランタイムは、開始スレッドの実行コンテキストが新しいスレッドにフローされることを保証します。このようにして、新しいスレッドは親スレッドと同じ権限を持ちます。このデータのコピーには、いくつかのリソースが必要です。ただし、このデータが必要ない場合は、ExecutionContext.SuppressFlow メソッドを使用してこの動作を無効にすることができます。"

出典: C# 試験 70-483 でのプログラミング。著者 : Wouter de Kort

ExecutionContext.SuppressFlow() を呼び出すと、アプリケーションの実行時間を短縮してパフォーマンスを向上させることができます。これは、メソッド呼び出しが親スレッドから子スレッドへのコンテキスト データのコピーを防止するためです。子スレッド内の親スレッドのコンテキスト データ。

于 2016-03-18T15:48:01.737 に答える