如何在C#Winforms应用程序中取消长时间运行的异步任务的执行

NoobPointerException

我是一位经验不足的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结构控制。您可以在可取消异步方法的签名中公开取消令牌,从而使它们可以在任务和调用方之间共享。在最常见的情况下,取消遵循以下流程:

  1. 调用方创建一个CancellationTokenSource对象。
  2. 调用方调用可取消的异步API,并从CancellationTokenSource(CancellationTokenSource.Token)传递CancellationToken。
  3. 调用方使用CancellationTokenSource对象(CancellationTokenSource.Cancel())请求取消。
  4. 任务通常会使用CancellationToken.ThrowIfCancellationRequested方法确认取消并自行取消。

为了使您的应用对取消请求做出快速响应,您需要使用长期运行的方法定期检查取消令牌,并在请求取消的情况下进行相应的响应。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF 5:如何在异步任务中取消长时间运行的查询

来自分类Dev

不确定如何取消长时间运行的异步任务

来自分类Dev

如何在自托管的.net核心mvc应用程序中运行长时间运行或重复运行的任务?

来自分类Dev

取消长时间运行的IFRAME

来自分类Dev

取消长时间运行的查询

来自分类Dev

长时间运行的线程如何在Web应用程序中工作

来自分类Dev

git:取消长时间运行的提交是否安全?

来自分类Dev

使用ISR取消长时间运行的功能

来自分类Dev

在可杀死的“线程”中运行JS;检测并取消长时间运行的进程

来自分类Dev

在可杀死的“线程”中运行JS;检测并取消长时间运行的进程

来自分类Dev

如何在Node JS中执行/中止长时间运行的任务?

来自分类Dev

如何确保在WPF应用程序中长时间运行的过程中更新了UI?

来自分类Dev

长时间运行的后台任务完成后,应用程序未挂起

来自分类Dev

如何在C#Winforms应用程序中显示chm文件

来自分类Dev

如何在.NET 4.0 C#WinForms应用程序中播放SWF文件?

来自分类Dev

Windows 服务应用程序仅执行一次长时间运行的任务并在完成后自行停止

来自分类Dev

长时间运行的控制台应用程序(C ++)的输入和输出文本

来自分类Dev

处理因取消长时间运行的异步调用而导致的 Outlook 插件检查器 UI 控制空引用异常的最佳方法是什么?

来自分类Dev

Blazor WebAssembly:如何在长时间运行的非异步过程中更新UI

来自分类Dev

Windows 10 UWP 应用在长时间运行的任务上异步/等待使用

来自分类Dev

如何在Eclipse Vert.x中执行长时间运行/轮询操作

来自分类Dev

sshj:如何在执行命令时从长时间运行的命令中读取InputStream

来自分类Dev

使用异步服务器长时间运行的任务

来自分类Dev

如何在我的Android应用中管理长时间运行的单例

来自分类Dev

.NET控制台应用程序与Web应用程序一起可处理长时间运行的任务

来自分类Dev

如何在PowerShell中停止长时间运行的cmdlet

来自分类Dev

如何在mysql中优化长时间运行的查询

来自分类Dev

如何取消可以多次取消的长时间运行的操作?

来自分类Dev

如何取消可以多次取消的长时间运行的操作?

Related 相关文章

  1. 1

    EF 5:如何在异步任务中取消长时间运行的查询

  2. 2

    不确定如何取消长时间运行的异步任务

  3. 3

    如何在自托管的.net核心mvc应用程序中运行长时间运行或重复运行的任务?

  4. 4

    取消长时间运行的IFRAME

  5. 5

    取消长时间运行的查询

  6. 6

    长时间运行的线程如何在Web应用程序中工作

  7. 7

    git:取消长时间运行的提交是否安全?

  8. 8

    使用ISR取消长时间运行的功能

  9. 9

    在可杀死的“线程”中运行JS;检测并取消长时间运行的进程

  10. 10

    在可杀死的“线程”中运行JS;检测并取消长时间运行的进程

  11. 11

    如何在Node JS中执行/中止长时间运行的任务?

  12. 12

    如何确保在WPF应用程序中长时间运行的过程中更新了UI?

  13. 13

    长时间运行的后台任务完成后,应用程序未挂起

  14. 14

    如何在C#Winforms应用程序中显示chm文件

  15. 15

    如何在.NET 4.0 C#WinForms应用程序中播放SWF文件?

  16. 16

    Windows 服务应用程序仅执行一次长时间运行的任务并在完成后自行停止

  17. 17

    长时间运行的控制台应用程序(C ++)的输入和输出文本

  18. 18

    处理因取消长时间运行的异步调用而导致的 Outlook 插件检查器 UI 控制空引用异常的最佳方法是什么?

  19. 19

    Blazor WebAssembly:如何在长时间运行的非异步过程中更新UI

  20. 20

    Windows 10 UWP 应用在长时间运行的任务上异步/等待使用

  21. 21

    如何在Eclipse Vert.x中执行长时间运行/轮询操作

  22. 22

    sshj:如何在执行命令时从长时间运行的命令中读取InputStream

  23. 23

    使用异步服务器长时间运行的任务

  24. 24

    如何在我的Android应用中管理长时间运行的单例

  25. 25

    .NET控制台应用程序与Web应用程序一起可处理长时间运行的任务

  26. 26

    如何在PowerShell中停止长时间运行的cmdlet

  27. 27

    如何在mysql中优化长时间运行的查询

  28. 28

    如何取消可以多次取消的长时间运行的操作?

  29. 29

    如何取消可以多次取消的长时间运行的操作?

热门标签

归档