【发布时间】:2010-02-11 23:39:07
【问题描述】:
我创建了一个抽象类,它实现了一个在单独的线程上运行另一个抽象方法的方法,如下所示:
public abstract class ATest
{
Thread t;
protected String status;
public void Start()
{
ThreadStart ts = new ThreadStart(PerformTest);
t = new Thread(ts);
t.Start();
}
public ATest(String status)
{
this.status=status;
}
public abstract void PerformTest();
}
这个想法是从 ATest 派生的类只实现 PerformTest 方法。因此,任何客户端都可以调用 Start() 方法在其自己的线程上启动 PerformTest() 中的操作。从 ATest 派生的类可能如下所示:
class ConcreteTest:ATest
{
public ConcreteTest(String status):base(status)
{
}
public override void PerformTest()
{
// Do some things...
// And some more...
status = "changed";
}
}
创建 ConcreteTest 对象时,我想传入一些对象(在示例中为字符串)。当 PerformTest() 在其单独的线程上运行时,该对象的状态将根据 PerformTest() 中的操作结果进行更改。使用上述类的示例:
class Program
{
static void Main(string[] args)
{
String isPassed = "original";
ATest test = new ConcreteTest(isPassed);
test.Start();
Console.WriteLine(isPassed); // Prints out "original"
}
}
所以我将 isPassed 设置为“原始”并将其传递给 ConcreteTest,后者在单独的线程上将值更改为“已更改”。因此,当我打印出 isPassed 时,我希望将值设置为“已更改”,但事实证明并非如此。我想这与在最初创建它的另一个线程上更改的值有关。谁能向我解释为什么我会出现这种行为,也许我可以做些什么来实现我正在寻找的功能(即在单独的线程上更改 isPassed 以便当线程完成时,控制台会打印出来“变了”?
【问题讨论】:
-
你不是将ispassed的副本传递给抽象类吗???为什么你期望它改变???
标签: c# .net multithreading