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

执行上下文。SuppressFlow抑制跨异步线程的执行上下文流。

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

执行上下文。RestoreFlow恢复线程之间执行上下文的通道。

最后

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

A : 正是抑制了以下信息的通过:安全上下文、调用上下文和同步上下文;在新创建的线程之间。为什么这样做?- 优化th.Length创建线程的创建和工作:线程之间传递的补充信息更少 - 线程之间的交互更快。

于 2009-12-23T10:35:09.200 回答
11

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

  • 主机执行上下文
  • IllogicalCallContext,Remoting 使用的线程特定数据的存储库
  • 逻辑上下文,如上
  • 安全上下文
  • 同步上下文

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

编辑:这个问题在 .NET 4.5 中通过 CultureInfo.DefaultThreadCurrentCulture 属性得到修复。

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

于 2009-12-23T11:08:20.780 回答
2

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

ExecutionContext.SuppressFlow:

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

ExecutionContext.RestoreFlow:

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

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

强调我的。

于 2009-12-23T10:58:37.150 回答
2

我读到这个 ​​- “当一个线程被创建时,运行时确保启动线程的执行上下文流向新线程。这样,新线程具有与父线程相同的权限。这种数据复制确实需要一些资源,但是。如果您不需要此数据,则可以使用 ExecutionContext.SuppressFlow 方法禁用此行为。”

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

您可以调用 ExecutionContext.SuppressFlow() 以通过减少应用程序的执行时间来提高性能,因为该方法调用将防止将上下文数据从父线程复制到子线程,否则当您可能不需要子线程中父线程的上下文数据。

于 2016-03-18T15:48:01.737 回答