我已經創建了一個實現運行在一個單獨的線程另一種抽象方法,這樣的方法的抽象類:如何在原始線程上更改傳遞給在單獨線程上運行的函數的值?
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對象我想在某些對象來傳遞(在本例中的String)。當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爲「originial」並將其傳遞給ConcreteTest,其在一個單獨的線程變爲值設置爲「改變」。所以,當我打印出isPassed我希望的價值被設置爲「改變」,但事實證明它不是。我想這與另一個線程上最初創建的線程上的值發生了變化。任何人都可以向我解釋爲什麼我會得到這種行爲,也許我可以做些什麼來實現我正在尋找的功能(即在單獨的線程上更改isPassed,以便線程完成後控制檯將打印出來「改變」?
您是否將一份副本傳遞給抽象類? 爲什麼你期望它改變? – gbianchi