S M*_*ran 7 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/>";
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
ExecutionContext的细节非常模糊,深埋在.NET Remoting和WCF等功能中.它的一部分是:
CultureInfo不是它的一部分,如果你改变主线程的默认文化,这可能是一个相当大的问题.除非您明确编写代码来切换它们,否则没有好办法确保其他线程与该文化一起运行.鉴于.NET易于在线程池线程上运行异步回调,这并不总是实用的.它们将初始化为系统默认文化.
编辑:在.NET 4.5中使用CultureInfo.DefaultThreadCurrentCulture属性修复了此问题.
Edit2:在.NET 4.6中更彻底地修复,文化现在按预期流动.
ExcecutionContext.SuppressFlow禁止跨异步线程执行上下文的流.
该执行上下文,都隐式地从父线程传递给孩子一个,提供有关执行的逻辑线程信息:安全上下文,调用上下文和同步上下文.如果该信息不是必需的,则省略执行上下文会优化多线程应用程序的性能.
执行上下文.RestoreFlow恢复线程之间执行上下文的传递.
最后
问:在下面的代码中究竟被压制了什么?
答:完全抑制了以下信息的传递:安全上下文,调用上下文和同步上下文; 在新创建的线程之间.为什么那样呢?- 优化th.Length创建的线程的创建和工作:线程之间传递的补充信息减少 - 这些线程在它们之间交互得越快.
归档时间: |
|
查看次数: |
9683 次 |
最近记录: |