首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程的ExecutionContext

线程的ExecutionContext
EN

Stack Overflow用户
提问于 2009-12-23 10:22:03
回答 4查看 14K关注 0票数 11

ExecutionContext.SuppressFlow();的目的是什么?在下面的代码中,到底什么会被抑制?

我有这个测试代码..。

代码语言:javascript
复制
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/>";
         }
      }
   }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-23 11:08:20

ExecutionContext的细节非常模糊,深埋在.NET远程处理和WCF等特性中。其中的一部分是:

  • HostExecutionContext
  • IllogicalCallContext,远程处理所使用的线程特定数据的存储库。
  • LogicalContext,如上所示
  • SecurityContext
  • SynchronizationContext

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

编辑:.NET 4.5中的CultureInfo.DefaultThreadCurrentCulture属性修复了这个问题。

Edit2:在.NET 4.6中更彻底地修正了,文化现在如预期的那样流动。

票数 11
EN

Stack Overflow用户

发布于 2009-12-23 10:35:09

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

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

ExecutionContext.RestoreFlow还原线程之间执行上下文的通道。

最后

Q:在下面的代码中,到底什么会被抑制??

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

票数 11
EN

Stack Overflow用户

发布于 2009-12-23 10:58:37

不是问题的答案,但既然您正在查看这段代码并试图立即理解它,请检查是否要根据文档修改/更改代码(即“修复它”):

ExecutionContext.SuppressFlow:

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

ExecutionContext.RestoreFlow:

RestoreFlow逆转先前SuppressFlow方法调用的效果。 此方法由AsyncFlowControl方法返回的SuppressFlow结构的Undo方法调用。您应该使用撤销方法来恢复执行上下文的流,而不是RestoreFlow方法.

强调我的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1951924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档