c# - 确保 C# 中静态方法的线程安全

标签 c# .net multithreading static thread-safety

我目前在静态类/方法中有一些代码,但我想检查它是否是线程安全的。从我读过的内容来看,我认为这应该没问题,但我内心深处的某些东西说它可能不是。我的网页的数据处理阶段使用外部网络服务来创建订单记录,这可能会很慢:可能需要 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
    }
}

(CreateOrderXML 是对 Web 服务 URL/方法的服务引用)是否是线程安全的,特别是对于长时间运行(主要在 xmlCo.Create(....) 阶段)并发线程?我知道如果我开始放入类成员然后在方法中使用它们,这肯定会引入不同线程覆盖值的问题,但只要对象是在方法中创建的,它们就应该没问题,应该'不是吗?

最佳答案

您似乎没有访问那里的任何共享数据;您正在请求远程资源,并在每次执行此方法时构建一组唯一的数据。那里不需要同步。

此处方法的每次执行都会创建局部变量 - 它是自己的副本。因此,不会共享任何内容。

关于c# - 确保 C# 中静态方法的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12392572/

相关文章:

c# - 从部分类 c# 调用 Base 实体构造函数

ios - FMDB 阻塞用户界面。但为什么?对替代实现有什么建议吗?

c# - 如何将自1970年1月1日以来的秒数转换为日期时间值?

c# - SmtpClient:指定获取 <mailSettings> 的位置

.net - .NET 中的 'closures' 是什么?

java - publishOn 和并行的区别

c# - Parallel.Foreach 在幕后做了什么?

c# - 是否可以将 c# 对象初始值设定项与工厂方法一起使用?

c# - ASP.Net PayPal Express Checkout 调用 SetExpressCheckout 并且没有响应

.net - 分发任何软件评估版的最佳方式?