奇点模式类的范围是什么? (涉及多线程)

时间:2012-11-08 20:24:52

标签: c# multithreading scope

对于我正在研究的项目,我正在实现一个类作为奇点。该类负责检测系统正在运行的阶段(开发,测试,生产等),并相应地返回某些值,以便我们的开发团队不必担心每次使用这些值时都要处理分段设置。此外,它允许我们覆盖当前阶段的目的,以便假装处于不同的阶段。

我担心的是,当涉及多线程时,奇点将如何表现。下面的代码概述了将要使用的基本设置。

我的问题是,如果节目& program2可能同时在不同的线程上运行,OverrideStage()函数(它改变实例中的私有变量)是否会干扰其他程序的预期行为?

示例:

1)程序启动,将阶段设置为DEV

2)在另一个主题上,Program2启动,将阶段设置为PRODUCTION

3)返回程序,尝试获取值,该值是否在DEV或PRODUCTION中?

namespace TESTING
{

class Program
{
    static void Run()
    {

        Staging stage = Staging.Instance;

        stage.OverrideStage(Staging.DEV);
            SqlConnection connDev = new SqlConnection(stage.ConnectionString("example")); // Connection to development database
            // Do Stuff
        stage.EndOverride();
            SqlConnection connBackToAuto = new SqlConnection(stage.ConnectionString("example")); // Connection to detected stage database
    }
}

class Program2
{             
    static void Run()
    {
        Staging s = Staging.Instance;
        s.OverrideStage(Staging.PRODUCTION);
            SqlConnection connDev = new SqlConnection(s.ConnectionString("example")); // Connection to production database
            // Do stuff
        s.EndOverride();
    }
}

} // End namespace

我想这个问题可以简化为:

s和舞台是同一个舞台实例吗?

1 个答案:

答案 0 :(得分:1)

我不相信你的申请可以有两个主要的切入点...你所描述的是不可行的,除非你指定多个入口点。

现在,如果可行(即你指定了多个入口点),那么

您尝试更改Staging模式将导致更新两个程序实例的模式。

让我们看看你的例子:

1) Program starts, sets stage to DEV    
2) On another thread, Program2 starts, sets stage to PRODUCTION
3) Back in Program, try to get a value, will the value be in DEV or PRODUCTION?

该值很可能是PRODUCTION,但根据线程的启动方式可能并非如此。它可能会变得复杂,因为如果两个线程一个接一个地相对快速地启动,那么该阶段可能是DEVPRODUCTION,具体取决于两个线程之间发生上下文切换的时间。

更新1.0

由于您已使用Main方法替换Run方法,因此删除了多个入口点。

更新2.0

单身或不单身

您所描述的情况非常混乱,主要是因为程序通常包含应用程序的Main入口点。在正常情况下,人们会期望该程序以DEVPRODUCTION模式运行。在不同的线程和不同的模式下运行多个程序实例是非常令人困惑的! 我想不出任何人想要这样做的现实例子。

让我们假设有一个不起眼的例子:最好的办法是为每个程序提供自己的内部暂存状态,而不是全局(Singleton)暂存状态。这可以保证您可以在多个线程中启动程序的多个实例,并且每个实例都可以彼此独立地运行。您通常希望尽可能少地在线程之间共享 - 有些人将其称为shared nothing architecture

什么是暂存模式?

如果采用Singleton方法,那么这个问题就很难回答。

  • 如果你有办法保证运行Program2的线程等待Program初始化(通过某种thread signalling mechanism),那么你可以保证模式将会是PRODUCTION
  • 如果您没有线程信令机制,则模式可能是DEVPRODUCTION,具体取决于许多问题。

实际上,您可以在不同的命名空间中创建单独的Staging类,并根据您使用的模式使用每个类。但是,这与维护两个单独的Staging类(即DevStagingProductionStaging没有什么不同。你通常希望避免两次编码相同的东西,所以这个选项开始看起来越来越不可取。

一般而言,了解您当前使用哪种暂存模式实际上与线程无关,这个问题在涉及线程时会被放大。您的Staging模式将更改的原因是因为两个程序都使用相同的暂存实例,该实例由Staging(单例)实例提供给它们。