2011-02-01 71 views
0

我正在用c#.net製作一個winform應用程序。此應用程序在後臺線程中運行算法以進行計算。但是我有兩個不同的algortihm來計算相同的數值,我想在運行時切換它們。這些算法每5秒運行一次,所以它們是無限的。我所嘗試的是用策略模式實現的,而線程則運行抽象方法。而當我點擊一個menuitem時,我更改具體的策略對象,所以方法將是相同的,但實現將有所不同。但它不適用於我,舊的算法不斷運行,我從頭開始。 所以總之。有沒有辦法在運行時更改正在運行的線程方法?運行時在線程中切換運行方法

謝謝你的幫助。

示例代碼:

//線程開始上下文對象的方法,它調用,抽象的策略算法方法

 appList = new RunAppList(); 
     myThread = new Thread(new ThreadStart(appList.Measure)); 
     myThread.IsBackground = true; 

//在這些方法我想切換,我設置了concretestrategy對象,通過該resultcallback代表的結果,這些對象返回

public void OnPowerSet(object sender, EventArgs e) 
    { 
     try 
     { 
      appList.SetMeasureAlgorithm(new WindowMeasureWithPowerSet(new ListCallback(ResultCallBack))); 
      if (!myThread.IsAlive) 
       myThread.Start(); 
     } 
     catch (ThreadStartException te) 
     { 
      Console.WriteLine(te.ToString()); 
     } 
    } 

    public void OnPolygon(object sender, EventArgs e) 
    { 
     appList.SetMeasureAlgorithm(new WindowMeasureWithPoligon(new ListCallback(ResultCallBack))); 
     if (!myThread.IsAlive) 
     { 
      myThread.Start(); 
     } 
    } 
enter code here 

更新:感謝大家的幫助,即時通訊有點dumm的編程,所以我嘗試,而不是你的意見,在我的方式。我不確定這是否是我的問題的正確解決方案,但似乎有效。我將線程從具體策略對象移到了上下文對象。

+0

對不起,您的問題含糊不清,很難給出適當的回答。 – mquander 2011-02-01 17:05:26

+0

發佈一些代碼,它看起來像你曾經打電話給工廠,所以你不能感覺到所要求的變化 – 2011-02-01 17:10:19

回答

1

取消,恢復或影響在C#中的另一個線程上發生的操作的最典型方法是使用共享變量進行通信。例如,如果要切換算法,第一個線程可以將標誌設置爲true,並且後臺線程可以在每次運行後檢查標誌並在必要時進行切換。

.NET中對此的一個充實實現是CancellationToken

2

這可能是由於許多事情之一。看起來最有可能的兩件事:

  1. 確保您的後臺線程正在檢查您設置要在其循環中使用的方法的變量,以便它看到它應該更改方法。
  2. 您用來標記運行哪種方法的變量應該標記爲volatile。