【问题标题】:Switch run method in a thread while running运行时在线程中切换运行方法
【发布时间】:2011-02-03 22:35:30
【问题描述】:

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

感谢您的帮助。

示例代码:

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

        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

更新:感谢大家的帮助,我对编程有点笨,所以我以我的方式尝试了你的建议。我不确定这是否是解决我的问题的正确方法,但似乎可行。我将线程从具体策略对象移到上下文对象。

【问题讨论】:

  • 抱歉,您的问题含糊不清,很难给出适当的答复。
  • 贴一些代码,看起来你调用了一次工厂,所以你感觉不到请求的变化

标签: c# multithreading


【解决方案1】:

这可能是由于许多原因之一。最有可能发生的两件事:

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

【讨论】:

  • 这就是我要说的。让主线程在工作线程正在运行的对象中设置标志。让工作线程定期检查标志以查看它应该做什么。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2011-02-08
    相关资源
    最近更新 更多