c# - 接受变量的静态成员会损坏吗?

标签 c# multithreading static thread-safety

我在形成这个问题时遇到了困难,所以我会尝试用几种方式来表述它,这样就不会重复关于静态方法的通常讨论。这可能更多是一个架构问题。

如果静态类上有一个静态成员接受传入的变量,那么如果操作使用率高且运行时间长,是否存在数据冲突/损坏的风险? IE:数据访问类接受对象图类型以持久保存到数据库中。

例如:

namespace MyApp.DAL.People
{

public static class Person
{
    public static void Insert(Entities.People.Person p)
    {
        // ADO.net code, try catch etc, execute to db, call other private method
        ....
        Helper(p);
    }

    private static void Helper(Entities.People.Person p)
    {
        // do work...

    }
}

}

如果用户“A”启动 Person.Insert(myNewPerson) 调用操作,该过程是否会在用户“B”使用静态类和方法保存其“person 对象”之前完全完成“到数据库。

操作是串行和异步的,本质上是阻塞静态类的使用吗?

如果应用程序(开发人员)尝试在应用程序空间中使用多个线程,这只是一个问题吗?

除非您明确为应用程序启动另一个线程,否则所有内容都在单个线程上运行吗?

顺便说一句,这是我在 SO 上发表的第一篇文章 - 特别感谢所有花时间发布问题/答案的人 - 感谢您的宝贵时间!

最佳答案

如果两个不同的线程同时调用Person.Insert,它们将同时执行。除非该方法中有一些显式的阻塞。

线程Ap参数中传递的数据将无法被线程B访问。当然,假设这两个线程传递对完全不同的对象实例的引用。

只要 Insert 方法中没有任何内容访问外部范围内的任何内容,调用就是完全安全的。例如,所有方法局部变量对于两个线程来说都是不同的。仅当该方法(或其调用的方法)开始访问外部范围的数据时,您才会开始遇到问题。

关于c# - 接受变量的静态成员会损坏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645770/

相关文章:

python - 静态类成员python

c# - 如何动态设置组合框的前景属性?

c# - asp.net core 2 从本地磁盘驱动器加载和显示图像

c# - 提前关闭与浏览器的连接并返回响应状态

java - 在本例中,为什么优先级较低的线程没有在优先级较高的线程之后执行?

c# - 关于C#中lock语句的困惑

C#:具有继承类型构造函数的 Func

java - 安卓 : How to pause and resume runnable thread?

java - 为什么我不能使用静态变量的值?

url - 动态或静态网址?