我正在使用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
更新:感谢大家的帮助,我对编程有些愚蠢,所以我试着以你的方式提出建议。我不确定这是否是我问题的正确解决方案,但它似乎有效。我将线程从具体策略对象移动到上下文对象。
答案 0 :(得分:2)
这可能是由于很多事情之一。这两件事最有可能发生:
答案 1 :(得分:1)
取消,恢复或影响在C#中另一个线程上发生的操作的最典型方法是使用共享变量进行通信。例如,如果要切换算法,第一个线程可以将标志设置为true,后台线程可以在每次运行后检查标志并在必要时进行切换。
.NET中对此的一个充实实现是CancellationToken
。