代码之家  ›  专栏  ›  技术社区  ›  S M Kamran

线程的执行上下文

  •  7
  • S M Kamran  · 技术社区  · 16 年前

    你的目的是什么 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 回复  |  直到 12 年前
        1
  •  9
  •   Hans Passant    9 年前

    ExecutionContext的细节非常模糊,深埋在.NET远程处理和WCF等功能中。

    • 不合逻辑的CallContext,远程处理使用的线程特定数据的存储库
    • LogicalContext,如上所述
    • 行绪

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

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

    Edit2:在.NET4.6中进行了更彻底的修复,文化现在按预期流动。

        2
  •  10
  •   serhio    16 年前

    例外上下文。 抑制异步线程之间的执行上下文流。

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

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

    最后

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

    A. 为什么? th.长度 创建的线程:线程之间传递的补充信息越少,线程之间的交互越快。

        3
  •  2
  •   Julius Depulla    10 年前

    然而,这种数据复制确实需要一些资源。如果不需要此数据,可以使用ExecutionContext.SuppressFlow方法禁用此行为。“

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

        4
  •  1
  •   Benjamin Podszun    16 年前

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

    ExecutionContext.SuppressFlow:

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

    ExecutionContext.RestoreFlow:

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

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

    我的。

        5
  •  0
  •   Navid Golforoushan    9 年前

    推荐文章