【问题标题】:Is this c# class/method thread-safe and concurrent access safe?这是 c# 类/方法线程安全和并发访问安全吗?
【发布时间】:2013-10-12 01:14:31
【问题描述】:

在下面的代码中,附件对象是线程安全的吗?如果在应用程序运行多个线程时调用代码对附件对象进行了更改,会发生什么情况?

谢谢。

public static class Util {
    public static int AddMessage(string message, IEnumerable<FileAttachment> attachments, Dictionary<int, object> customFieldValues = null, int? assigneeUserId = null) {
        foreach (FileAttachment current2 in attachments) {
            //do something
        }
    }
}

【问题讨论】:

    标签: c# class methods static thread-safety


    【解决方案1】:

    在下面的代码中,附件对象是线程安全的吗?如果在应用程序运行多个线程时调用代码对附件对象进行了更改,会发生什么情况?

    这里没有任何迹象表明attachments 是线程安全的。如果其他线程可以访问这些实例并更改这些对象中的属性,则可能会发生不好的事情。

    一个简单的例子——如果实际的可枚举对象恰好是List&lt;T&gt;,并且另一个线程添加或删除了附件,则foreach 循环将在枚举时抛出,因为底层集合发生了变化......

    【讨论】:

    • 谢谢。并且如果这段代码被放置在一个由 IIs 托管的网站中,并且多个用户同时访问同一个页面(我的意思是相同的代码),会发生什么情况?通过在 IIs 下托管的网站,这种并发访问安全吗?
    • @stacker 如果您使用的是 ASP.NET,请注意工作进程可以随时回收,从而导致您的内存中数据在没有警告的情况下丢失。
    • @stacker 无法通过发布的代码知道这是否是线程安全的,但如果您使用共享/静态数据,它很可能不是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2012-11-22
    相关资源
    最近更新 更多