线程的ExecutionContext

时间:2009-12-23 10:22:04

标签: c# multithreading threadcontext

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/>";
         }
      }
   }
}

5 个答案:

答案 0 :(得分:8)

ExecutionContext的细节非常模糊,深埋在.NET Remoting和WCF等功能中。 它的一部分是:

  • HostExecutionContext
  • IllogicalCallContext,Remoting使用的线程特定数据的存储库
  • LogicalContext,如上所述
  • SecurityContext的
  • 的SynchronizationContext

CultureInfo不是它的一部分,如果你改变主线程的默认文化,这可能是一个相当大的问题。除非您明确编写代码来切换它们,否则没有好办法确保其他线程与该文化一起运行。鉴于.NET易于在线程池线程上运行异步回调,这并不总是实用的。它们将初始化为系统默认文化。

编辑:使用CultureInfo.DefaultThreadCurrentCulture属性在.NET 4.5中修复了此问题。

Edit2:在.NET 4.6中更加彻底地修复,文化现在按预期流动。

答案 1 :(得分:7)

ExcecutionContext。 SuppressFlow 禁止跨异步线程执行上下文的流程。

ExecutionContext ,从父线程隐式传递给子线程,提供与逻辑执行线程相关的信息:安全上下文,调用上下文和同步上下文。如果该信息不是必需的,则省略执行上下文可以优化多线程应用程序的性能。

ExecutionContext。 RestoreFlow 恢复线程之间执行上下文的传递。

最后

在下面的代码中究竟会被抑制什么?

A :完全抑制了以下信息的传递:安全上下文,调用上下文和同步上下文;在新创建的线程之间。 为什么这样做? - 优化 th.Length 创建的线程的创建和工作:在线程之间传递的补充信息更少 - 这些线程在它们之间进行交互的速度更快。

答案 2 :(得分:1)

不是您的问题的答案,但由于您正在查看此代码并尝试立即了解它,请检查您是否要根据文档调整/更改您的代码(即“修复它”):

ExecutionContext.SuppressFlow:

  

您必须对返回的AsyncFlowControl结构使用Undo方法来恢复ExecutionContext的流程。

ExecutionContext.RestoreFlow:

  

RestoreFlow会反转先前的SuppressFlow方法调用的效果。

     

此方法由SuppressFlow方法返回的AsyncFlowControl结构的Undo方法调用。 您应该使用Undo方法来恢复执行上下文的流,而不是RestoreFlow方法。

强调我的。

答案 3 :(得分:1)

我读了这个 - &#34;当创建一个线程时,运行时确保启动线程的执行上下文流到新线程。这样,新线程具有与父线程相同的权限。 然而,这种数据复制确实需要花费一些资源。如果您不需要此数据,可以使用ExecutionContext.SuppressFlow方法禁用此行为。&#34;

资料来源:C#考试编程70-483。作者:Wouter de Kort

答案 4 :(得分:0)

创建线程时,运行时会确保启动线程的执行上下文流向新线程。这样,新线程具有与父线程相同的权限。然而,这种数据复制确实需要花费一些资源。如果您不需要此数据,可以使用ExecutionContext.SuppressFlow方法禁用此行为。