Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态属性作为该类实例的线程安全考虑 请考虑此代码: public class BusinessClass { static BusinessClass myClass { get; set; } Repository repo; public BusinessClass() { if (repo == null) repo = new RepositoryClass(); } public static BusinessClass Instance { get { if (myClass == null) myClass = new BusinessClass(); return myClass ; } } public void Update(Entity Item) { repo.Update(Item); } }_C#_Asp.net_Concurrency_Thread Safety_C# 6.0 - Fatal编程技术网

C# 静态属性作为该类实例的线程安全考虑 请考虑此代码: public class BusinessClass { static BusinessClass myClass { get; set; } Repository repo; public BusinessClass() { if (repo == null) repo = new RepositoryClass(); } public static BusinessClass Instance { get { if (myClass == null) myClass = new BusinessClass(); return myClass ; } } public void Update(Entity Item) { repo.Update(Item); } }

C# 静态属性作为该类实例的线程安全考虑 请考虑此代码: public class BusinessClass { static BusinessClass myClass { get; set; } Repository repo; public BusinessClass() { if (repo == null) repo = new RepositoryClass(); } public static BusinessClass Instance { get { if (myClass == null) myClass = new BusinessClass(); return myClass ; } } public void Update(Entity Item) { repo.Update(Item); } },c#,asp.net,concurrency,thread-safety,c#-6.0,C#,Asp.net,Concurrency,Thread Safety,C# 6.0,我想在我的网页中使用此BL,如下所示: BusinessClass.Instance.Update(Item); 我的问题是:这段代码对线程安全有问题吗?在更新方法中,两个人可以同时走到一起吗 谢谢,这不是线程安全的。以下是可能发生的情况的一个示例: Thread1:如果myClass==null它不是线程安全的。以下是可能发生的情况的一个示例: Thread1:如果myClass==null,则第一种情况为-asp.net会话锁 如果使用asp.net窗体和asp.net会话,则会话将锁定所

我想在我的网页中使用此BL,如下所示:

BusinessClass.Instance.Update(Item);
我的问题是:这段代码对线程安全有问题吗?在更新方法中,两个人可以同时走到一起吗

谢谢,这不是线程安全的。以下是可能发生的情况的一个示例:

Thread1:如果myClass==null它不是线程安全的。以下是可能发生的情况的一个示例:

Thread1:如果myClass==null,则第一种情况为-asp.net会话锁 如果使用asp.net窗体和asp.net会话,则会话将锁定所有用户的整个调用,因此不需要额外注意同步

相关问题:

第二种情况-本地线程。 如果不使用asp.net会话,或者在同一调用中打开额外线程,则需要锁定静态数据的操作

public class BusinessClass
{
    private static readonly object oLock = new object();

    static BusinessClass myClass { get; set; } = null;
    Repository repo;

    public BusinessClass()
    {
        if (repo == null)
            repo = new RepositoryClass();
    }

    public static BusinessClass Instance
    {
        get
        {
            if myClass == null)
            {
                lock (oLock)
                {
                    if myClass == null)
                        myClass = new BusinessClass();
                }
            }
            return myClass  
        }
    }

    public void Update(Entity Item)
    {
        repo.Update(Item);
    }
}
最后一个案例——全球变化 如果您希望再次检查数据库或文件上的全局更改,或系统模拟编辑中可能更改的任何内容-在同一站点的web garden多池上运行的web平台上。。。并忽略会话

然后您需要同步所有呼叫

通过使用,您还需要在更新之前检查记录是否仍然相同,如果不是,则表示其他人更改了该记录,并且当前用户将覆盖该记录

多考虑多用户环境。 想想这个场景。 用户A和B,加载相同的页面、相同的数据,并且每一个都会更改它们

用户将保存每一个数据-不是在同一时刻-但有很多不同的时间。您记录的数据是最后保存的数据。其中一个用户将丢失其更改

<> P>因此,如果用户更新相同的数据-超出锁定系统,则需要多个用户在多用户环境中考虑同步信号。

第一种情况- ASP.NET会话锁 如果使用asp.net窗体和asp.net会话,则会话将锁定所有用户的整个调用,因此不需要额外注意同步

相关问题:

第二种情况-本地线程。 如果不使用asp.net会话,或者在同一调用中打开额外线程,则需要锁定静态数据的操作

public class BusinessClass
{
    private static readonly object oLock = new object();

    static BusinessClass myClass { get; set; } = null;
    Repository repo;

    public BusinessClass()
    {
        if (repo == null)
            repo = new RepositoryClass();
    }

    public static BusinessClass Instance
    {
        get
        {
            if myClass == null)
            {
                lock (oLock)
                {
                    if myClass == null)
                        myClass = new BusinessClass();
                }
            }
            return myClass  
        }
    }

    public void Update(Entity Item)
    {
        repo.Update(Item);
    }
}
最后一个案例——全球变化 如果您希望再次检查数据库或文件上的全局更改,或系统模拟编辑中可能更改的任何内容-在同一站点的web garden多池上运行的web平台上。。。并忽略会话

然后您需要同步所有呼叫

通过使用,您还需要在更新之前检查记录是否仍然相同,如果不是,则表示其他人更改了该记录,并且当前用户将覆盖该记录

多考虑多用户环境。 想想这个场景。 用户A和B,加载相同的页面、相同的数据,并且每一个都会更改它们

用户将保存每一个数据-不是在同一时刻-但有很多不同的时间。您记录的数据是最后保存的数据。其中一个用户将丢失其更改


<> p>因此,如果用户更新相同的数据-超出锁定系统,则需要更多的考虑并在多用户环境中生成更多同步信号。

两个请求将由两个不同的调用来处理相同的方法,每个方法都有自己的堆栈,所以本地变量将不被共享。但是,BusinessClass.Instance将被共享。这是否正确取决于您自己。两个请求将由对同一方法的两个不同调用处理,每个调用都有自己的堆栈,因此不会共享局部变量。但是,BusinessClass.Instance将被共享。这是否正确取决于你自己。即使你很幸运,并且顺序正确,你仍然可能需要一个内存屏障才能在两个线程上获得相同的值。更多信息:即使您很幸运,并且顺序正确,您仍然可能需要一个内存屏障才能在两个线程上获得相同的值。更多信息:谢谢亲爱的@Aristos。我使用的是ASP.NETWeb表单,我的代码是线程安全的吗?您能详细解释第一种情况吗?它在静态类和静态属性上工作吗?@asp.net使用的会话是一个线程安全模块,它锁定用户的每个完整调用。我提供了一些链接来解释这种情况。实际上很难避免整个锁。对于started站点来说是一个很大的帮助,因为它可以很好地同步您的编辑。现在,在静态操作变量时使用lock{}也不错,以防万一,它对任何事情的作用实际上都是锁定每次调用-您可以尝试一些实验,您可以自己在页面上添加一些线程延迟,并尝试使用open session多次调用它,例如
在会话关闭的情况下再试一次,您会看到结果。最后,您会发现,要避免同步比其他任何事情都要困难——如果您试图让多个用户同时工作并执行长时间作业,则结束时删除整个会话并从头开始创建新会话。这就是asp.net处理程序在默认情况下没有会话的原因。。。能够下载大量的数据,但更糟糕的是,考虑Web FixMSCNARIOS有多个静态实例的副本,因为TEHY以冗余的方式运行或在多个应用程序池中运行。谢谢亲爱的Aristos。我使用的是ASP.NETWeb表单,我的代码是线程安全的吗?您能详细解释第一种情况吗?它在静态类和静态属性上工作吗?@asp.net使用的会话是一个线程安全模块,它锁定用户的每个完整调用。我提供了一些链接来解释这种情况。实际上很难避免整个锁。对于started站点来说是一个很大的帮助,因为它可以很好地同步您的编辑。现在,在静态操作变量时使用lock{}也不错,以防万一,它对任何事情的作用实际上都是锁定每次调用-您可以尝试一些实验-您可以自己在页面上添加一些线程延迟,并尝试使用open session多次调用它,然后在session关闭的情况下重试-然后您会看到结果。最后,您会发现,要避免同步比其他任何事情都要困难——如果您试图让多个用户同时工作并执行长时间作业,则结束时删除整个会话并从头开始创建新会话。这就是asp.net处理程序在默认情况下没有会话的原因。。。可以下载大量的数据,但更糟糕的是,考虑Web FixMSCNARIOS有多个静态实例的副本,因为TEHY以冗余的方式运行或在多个应用程序池中运行。