几天前,作为一个 c# 新手,我写了一个类,感谢将不同线程使用的公共变量(但不同的值(放入其中是件好事,每个变量访问不同的 postgres 数据库。最近,对 c# 有了更多的了解,我想知道这是否真的正确。鉴于我到处读到的内容,我期望由线程"一"初始化的字段将被线程"二"覆盖,换句话说,两个线程最终将为所有字段获得相同的值。
事实上,它似乎不是那样工作的,每个线程似乎都保留自己的值,线程 1 仍然具有 db1 值,线程 2 具有 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}paramsconfig.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);
}
给定问题中的示例代码,没有理由期望一个线程覆盖另一个线程的字段。当该代码执行时,将创建两个新线程,并且这些线程独立并发执行文件 I-O,读取"db1"和"dn2"文件路径。
如果在 startthd1(( 和 startthd2(( 中的 "Chkthd gth = new Chk(ncontext(;"语句上放置断点,您应该期望两个线程一起在这些语句处停止,并且每个方法中的局部变量保存从两个文件中读取的不同数据。
我怀疑线程不需要在示例代码中使用,并且有一个更简单的解决方案。
以下运行速度稍慢的代码是否提供了所需的结果?
Chk gth1 = ReadFileData( "db1" );
Chk gth2 = ReadFileData( "db2" );
public static Chkthd ReadFileData( string dbName ) {
Context ncontext = new Context("db2");
return new Chk(ncontext);
}