我是一位经验不足的C#程序员,在管理程序流程方面需要帮助。它是一个WinFormApp,它要求多个用户输入,然后使用它们来与设备建立串行通信以进行测量。使用异步方法进行测量,大约需要20分钟才能运行。所以我在用
void main()
{
//Setup
}
private void button1_Click(object sender, EventArgs e)
{
await measurements();
//Plot results
}
private async Task measurements()
{
while(true){
//Make some measurements
await Task.Delay(120000);
//Make measurements, present data in the UI form.
//return if done
}
}
现在,我需要创建一个按钮,使用户可以取消测量,以更改某些输入或参数,然后重新启动测量。因此,我添加了“取消”按钮。
private void button7_Click(object sender, EventArgs e)
{
textBox64.Enabled = true;
button6.Enabled = true;
button5.Enabled = true;
textBox63.Enabled = true;
button3.Enabled = true;
trackBar1.Enabled = true;
timer.Enabled = true;
button7.Enabled = false;
clearData();
// measurement.Stop();
}
现在我不知道如何管理程序的流程。我试图建立一个try-catch
结构button1_Click()
并从中抛出异常button7_Click
,但是并没有达到异常button1_Click()
。
然后,我尝试measurements()
在新线程上运行。但是该线程无法访问我的主窗体上的70多个UI项目。
甚至我也不会像尝试Goto那样陷入低谷。
我需要的是关于如何在这种情况下进行编程的建议,以便对应用程序有一个良好的控制,而不会因为异常和Goto之类的风险而损害程序的流程。
如果要中途取消实际任务,则需要查看使用CancellationTokenSource并将取消令牌传递到异步方法中。
这是Microsoft文档的底部,在底部有一个很好的例子,这是另一个很好的博客,展示了进度条并允许取消。第二篇文章有一个很好的概述:
取消由CancellationToken结构控制。您可以在可取消异步方法的签名中公开取消令牌,从而使它们可以在任务和调用方之间共享。在最常见的情况下,取消遵循以下流程:
- 调用方创建一个CancellationTokenSource对象。
- 调用方调用可取消的异步API,并从CancellationTokenSource(CancellationTokenSource.Token)传递CancellationToken。
- 调用方使用CancellationTokenSource对象(CancellationTokenSource.Cancel())请求取消。
- 任务通常会使用CancellationToken.ThrowIfCancellationRequested方法确认取消并自行取消。
为了使您的应用对取消请求做出快速响应,您需要使用长期运行的方法定期检查取消令牌,并在请求取消的情况下进行相应的响应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句