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/>";
}
}
}
}发布于 2009-12-23 11:08:20
ExecutionContext的细节非常模糊,深埋在.NET远程处理和WCF等特性中。其中的一部分是:
CultureInfo不是它的一部分,如果您更改主线程的默认区域性,这将是一个相当大的问题。除非您显式地编写代码来切换这些线程,否则没有一种很好的方法来确保其他线程与该区域性一起运行。这并不总是实用的,因为.NET倾向于在线程池线程上运行异步回调。它们将被初始化为系统默认区域性。
编辑:.NET 4.5中的CultureInfo.DefaultThreadCurrentCulture属性修复了这个问题。
Edit2:在.NET 4.6中更彻底地修正了,文化现在如预期的那样流动。
发布于 2009-12-23 10:35:09
ExcecutionContext.SuppressFlow抑制跨异步线程的执行上下文流。
ExecutionContext,从父线程隐式传递到子线程,提供与执行逻辑线程相关的信息:安全上下文、调用上下文和同步上下文。如果该信息不是必需的,那么省略执行上下文就可以稍微优化多线程应用程序的性能。
ExecutionContext.RestoreFlow还原线程之间执行上下文的通道。
最后
Q:在下面的代码中,到底什么会被抑制??
A:精确地抑制了以下信息的传递:安全上下文、调用上下文和同步上下文;在新创建的线程之间。为什么要这样做?-To优化了th.Length创建的线程的创建和工作:线程之间传递的补充信息更少--这些线程在它们之间交互的速度更快。
发布于 2009-12-23 10:58:37
不是问题的答案,但既然您正在查看这段代码并试图立即理解它,请检查是否要根据文档修改/更改代码(即“修复它”):
ExecutionContext.SuppressFlow:
必须在返回的AsyncFlowControl结构上使用Undo方法来恢复ExecutionContext流。
ExecutionContext.RestoreFlow:
RestoreFlow逆转先前SuppressFlow方法调用的效果。 此方法由AsyncFlowControl方法返回的SuppressFlow结构的Undo方法调用。您应该使用撤销方法来恢复执行上下文的流,而不是RestoreFlow方法.。
强调我的。
https://stackoverflow.com/questions/1951924
复制相似问题