运行时在线程中切换运行方法

时间:2011-02-01 17:03:25

标签: c# multithreading

我正在使用c#.net创建一个winform应用程序。此应用程序在后台线程中运行算法,以进行计算。但我有2个不同的算法计算相同,我想在运行时间切换它们。这些算法每5秒运行一次,因此它们是infinte。我尝试过的,用策略模式实现的,以及线程,运行抽象方法。当我点击一个menuitem时,我改变了具体的Strategy对象,所以方法将是相同的,但实现方式会有所不同。但它对我没有用,旧算法不断运行,我从一开始就开始了。 所以总结一下。有没有办法在运行时更改正在运行的线程方法?

感谢您的帮助。

示例代码:

//线程启动上下文对象的方法,该方法调用抽象策略算法方法

        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

更新:感谢大家的帮助,我对编程有些愚蠢,所以我试着以你的方式提出建议。我不确定这是否是我问题的正确解决方案,但它似乎有效。我将线程从具体策略对象移动到上下文对象。

2 个答案:

答案 0 :(得分:2)

这可能是由于很多事情之一。这两件事最有可能发生:

  1. 确保您的后台线程正在检查您在其循环中设置方法的变量,以便它看到它应该更改方法。
  2. 用于标记要运行的方法的变量应标记为volatile。

答案 1 :(得分:1)

取消,恢复或影响在C#中另一个线程上发生的操作的最典型方法是使用共享变量进行通信。例如,如果要切换算法,第一个线程可以将标志设置为true,后台线程可以在每次运行后检查标志并在必要时进行切换。

.NET中对此的一个充实实现是CancellationToken