【问题标题】:Fields from same instance keep values来自同一实例的字段保留值
【发布时间】:2018-01-13 12:31:42
【问题描述】:

几天前,作为一个 c# 新手,我写了一个类,感谢将不同线程使用的公共变量(但不同的值)放入其中,每个变量都访问不同的 postgres 数据库。最近,对 c# 有了更多了解,我想知道这是否真的正确。鉴于我到处读到的内容,我期望线程“one”初始化的字段将被线程“two”覆盖,换句话说,两个线程最终会为所有字段获得相同的值。

事实上,它似乎不是这样工作的,每个线程似乎都保持自己的值,线程一仍然是 db1 值,线程二是 db2 值。这怎么可能?当我感谢我理解来自同一类的不同实例的字段共享相同的值时,我错了吗?

我用的是Visual Studio 2013,需要在代码开头设置[STAThread],能解释一下吗?

感谢您的友好和熟练的解释

奥利维尔

public class Context
{
    public string host; 
    public string port;
    public string user;
    public string pwd;
    public string dbname;
...
public Context(string db) {// Each thread is launched with a different database name
        try { 
        var rep = string.Format(@"D:\Bd\{0}\params\config.txt",db); // one file for each thread
        if (File.Exists(rep)) {
            var dic = File.ReadAllLines(rep)
              .Select(l => l.Split(new[] { '=' }))
              .ToDictionary(s => s[0].Trim(), s => s[1].Trim());
            host = dic["host"];
            port = dic["port"];
            user = dic["user"];
            pwd = dic["pwd"];
            dbname = db;
...
Thread thThd1 = new Thread(startthd1);
thThd1.Start();

public static void startthd1() {
   Context ncontext = new Context("db1");
   Chkthd gth = new Chk(ncontext);
    }

Thread thThd2 = new Thread(startthd2);
thThd2.Start();

public static void startthd2() {
   Context ncontext = new Context("db2");
   Chkthd gth = new Chk(ncontext);
    }

【问题讨论】:

  • 听起来你只有多个实例——每个实例都有单独的字段值,不管线程如何。如果您可以提供minimal reproducible example(无需访问数据库),您的期望会更容易理解。
  • @Oliver:在代码中创建新线程是相当先进的,而不是程序员在使用新语言的第一周内通常会探索的东西。您是否创建示例代码只是为了试验线程,或者您认为多线程对于您要解决的问题至关重要?
  • 嗨,我的期望是能够让多个任务在不同的模式(当然是相同的结构)和不同的数据库中完成相同的工作。我对 .Net 有相当长的经验,但它是使用 VB 而不是 C#,这似乎需要深厚的知识来制作智能工具并改变你的思维方式。感谢 Jon 和 comeCase 的帮助,非常感谢!

标签: c# multithreading postgresql shared instance-variables


【解决方案1】:

鉴于问题中的示例代码,没有理由期望一个线程覆盖另一个线程的字段。当该代码执行时,会创建两个新线程,这些线程独立并同时执行文件 I-O,读取“db1”和“dn2”文件路径。

如果在“Chkthd gth = new Chk(ncontext);”上放置断点startthd1() 和 startthd2() 中的语句,您应该期望两个线程一起在这些语句处停止,并且每个方法中的局部变量保存从两个文件中读取的不同数据。

我怀疑示例代码中不需要使用线程,并且有一个更简单的解决方案。

以下代码(运行速度稍慢)是否提供所需的结果?

Chk gth1 = ReadFileData( "db1" );
Chk gth2 = ReadFileData( "db2" );

public static Chkthd ReadFileData( string dbName ) {
   Context ncontext = new Context("db2");
   return new Chk(ncontext);
    }

【讨论】:

  • 嗨 camelCase,非常感谢您的回答,一切都像您在 §2 中所说的那样运行和我一样,每个线程一个实例的同一个类。所以这是一个好消息,我可以保持柔软。我想同时启动多个线程,因为我想管理多个任务并将它们一起运行,而不是一个接一个地运行。再次感谢您的宝贵时间 Olivier
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多