当用户单击运行时,应用程序会运行大量代码以生成模型并将其显示在图表中。跑步大约需要 1-2 分钟。我还有一个取消按钮,在单击“运行”按钮后启用。我正在使用 DotSpatial,因此我的按钮位于功能区 UI 的插件面板上。插件中Run和Cancel上的click事件启动,调用后端类的代码Run和Click。
当用户在运行开始后点击取消时,有一个延迟,但取消方法被调用并执行,但运行从未停止,我们最终看到图表显示。所以,我想我需要一个单独的线程来运行。我对编程相当陌生,从未使用过线程。我已经查看并添加了以下代码,但我的线程方法没有运行。这是我的代码:
单击运行按钮:
这是在顶部:
//check to see if RunModel thread needs to stop or continue
private volatile bool stopRun = false;
private Thread runThread;
然后这是从 click 事件中调用的方法:
public void btnRun_testingThread(object sender, EventArgs e)
{
//create a new thread to run the RunModel
if (runThread == null)
{
//we don't want to stop this thread
stopRun = false;
runThread = new Thread(RunModel);
runThread.Start(); <--this isn't doing anything
}
所以,我认为当代码到达 runThread.Start() 时,它会跳转到我的 RunModel 方法并开始运行代码。但事实并非如此。此外,我想取消这个线程(一旦我让它正常工作),所以我有这个,它从取消点击方法中调用:
private void StopRunThread()
{
if (runThread != null)
{
//we want to stop the thread
stopRun = true;
//gracefully pause until the thread exits
runThread.Join();
runThread = null;
}
}
然后这是我偶尔检查的 RunModel() 以查看 stopRun 布尔值是否已更改。
public void RunModel()
{
...some code.....
//check to see if cancel was clicked
if (stopRun)
{
....clean up code....
return;
}
....some more code....
//check to see if cancel was clicked
if (stopRun)
{
....clean up code....
return;
}
}
以及取消按钮的点击方法:
public void btnCancel_Click(Object sender, EventArgs e)
{
stopRun = true;
StopRunThread();
//the model run has been canceled
....some code.....
}
对让 thread.start 实际运行 Run 方法有任何帮助吗?那么我是否需要不断检查运行中的 volatile bool 以便在停止时清理所有内容?谢谢!