当用户点击“运行”按钮时,应用程序会运行大量代码以生成模型并在图表中显示。运行需要大约1-2分钟的时间。我还有一个“取消”按钮,该按钮在单击“运行”按钮后启用。我正在使用DotSpatial,因此我的按钮位于功能区UI中的插件面板上。运行和取消的单击事件从插件开始,在其中调用后端类的代码运行和单击。
当用户在运行启动后点击取消时,会有延迟,但是取消方法被调用并执行,但运行永远不会停止,最终我们会看到图表显示。所以,我认为我需要一个独立的线程来运行。我对编程比较陌生,之前没有使用过线程。我已经研究了一下并添加了以下代码,但我的线程方法没有运行。这是我的代码:
运行按钮被点击:
这是在顶部:
然后,这是从点击事件调用的方法:
任何有助于使线程启动Run方法的帮助?那么,我需要不断检查运行中的volatile bool来清理所有东西,如果它被停止了吗?谢谢!
当用户在运行启动后点击取消时,会有延迟,但是取消方法被调用并执行,但运行永远不会停止,最终我们会看到图表显示。所以,我认为我需要一个独立的线程来运行。我对编程比较陌生,之前没有使用过线程。我已经研究了一下并添加了以下代码,但我的线程方法没有运行。这是我的代码:
运行按钮被点击:
这是在顶部:
//check to see if RunModel thread needs to stop or continue
private volatile bool stopRun = false;
private Thread runThread;
然后,这是从点击事件调用的方法:
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.....
}
任何有助于使线程启动Run方法的帮助?那么,我需要不断检查运行中的volatile bool来清理所有东西,如果它被停止了吗?谢谢!