Mad*_*ing 5 .net c# static multithreading thread-safety
我有一些我目前在静态类/方法中的代码,但我想检查它是否是线程安全的.从我读过的内容来看,我认为这应该没问题,但我脑海中的一些事情却说它可能不是.我的网页的数据处理阶段使用外部Web服务来创建订单记录,这可能非常慢:可能是30-40秒,可能是5或10分钟(这不在我的手中)所以我要开火返回页面返回给用户,然后启动一个新线程,然后在处理完成后通过电子邮件发送给用户.这是一个静态类/方法.如果我的所有对象都是在特定方法中创建的(除了系统默认值,这是常见的)该方法应该是线程安全的,不应该.所以,例如,如果我有
public static class ProcessOrder()
{
public static int GetOrderMaxSize()
{
return (....gets and parses ConfigurationManager.AppSettings["MaxOrderSize"]...);
}
public static bool CreateOrder(Order order)
{
XmlDocument xmlDoc = GetOrderXML(order);
bool check = false;
using (CreateOrderXML.Create xmlCo = new CreateOrderXML.Create())
{
xmlCo.Timeout = 60000;
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
string xmlString = "";
using (StringWriter stringWriter = new StringWriter())
{
using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter))
{
xmlDoc.WriteTo(xmlWriter);
xmlWriter.Flush();
xmlString = stringWriter.GetStringBuilder().ToString();
}
}
byte[] bXMLOrder = encoding.GetBytes(xmlString);
byte[] breturnMessage;
check = xmlCo.Create(bXMLOrder, out breturnMessage);
.... do something with return message
}
return check;
}
private static XmlDocument GetOrderXML(Order order)
{
... creates an XML object for the order
}
}
Run Code Online (Sandbox Code Playgroud)
(CreateOrderXML是对Web服务URL /方法的服务引用)是否是线程安全的,特别是对于长时间运行(主要在xmlCo.Create(....)阶段)并发线程?我明白,如果我开始使用类成员然后在方法中使用它们,这肯定会引入不同线程覆盖值的问题,但只要在方法中创建对象,它们应该没问题,应该'他们?
And*_*ber 13
它看起来不像你在那里访问任何共享数据; 您正在请求远程资源,并在每次执行此方法时构建一组唯一的数据.那里不需要同步.
这里方法的每次执行都是创建局部变量 - 它是自己的副本.所以什么都没有被分享.
如果静态方法不访问任何静态(类)数据,则它应该是线程安全的.唯一可能的争用点是它可能使用的外部资源(例如文件或其他系统资源),以及传入的数据.只有您知道这种用法的上下文.
对可能存在争用的事物的使用可以与lock其他原始序列序列化.不要忘记以相同的顺序序列化资源,以免死锁.如果您有一个使用资源A和B的方法:
lock( latch_a )
{
process(object_a) ;
lock ( latch_b )
{
process(object_a,object_b) ;
}
}
Run Code Online (Sandbox Code Playgroud)
和另一种做反过来的方法:
lock( latch_b )
{
process(object_b) ;
lock ( latch_a )
{
process(object_a,object_b) ;
}
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,你的两个线程将会死锁,当每个线程需要一个资源时,另一个需要bofore它可以放弃对所述资源的访问.
编辑注意:
有关lock详细信息,请参阅语句的C#文档.通常,锁定的对象表示(并且可能是)正在序列化的共享资源访问.一个常见的模式是做类似的事情:
class Widget
{
private static readonly object X = new object() ;
public void Foo()
{
lock(X)
{
// Do work using shared resource
}
return ;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12017 次 |
| 最近记录: |