2011-02-01 73 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。