0

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

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

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

例子:

1) 程序启动,为 DEV 搭建舞台

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

3)回到Program,尝试获取一个值,该值是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 和 stage 是同一个 Staging 实例吗?

4

1 回答 1

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

单身还是不单身

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

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

什么是分期模式?

如果您采用 Singleton 方法,那么这个问题将变得非常难以回答。

  • 如果您有办法保证正在运行的线程Program2等待Program被初始化(通过某种线程信号机制),那么您就可以保证模式将为PRODUCTION.
  • 如果您没有线程信号机制,那么该模式可能是DEVPRODUCTION取决于许多问题。

实际上,您可以Staging在不同的命名空间中创建一个单独的类,并且根据您使用的模式来使用每个类。但是,这与维护两个单独的暂存类(即DevStagingProductionStaging. 您通常希望避免对同一事物进行两次编码,因此此选项开始看起来越来越不受欢迎。

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

于 2012-11-08T20:30:15.203 回答