zoukankan      html  css  js  c++  java
  • 异步学习

    使用多线程和异步主要应用长时间运行而界面卡死的情况,使用异步用户操作更加流畅。

    同时也要注意不要滥用异步,能用同步方法就用同步,因为常常同步方法比异步更有效。

    下面就以一个小例子介绍一下怎么异步使用

    例子:WPF窗口中有一个按钮,点击按钮进行计算,在计算过程中显示进度,计算完成后显示结果,如果中间想取消计算,可以用另一个按钮点击来取消操作。

    取消操作主要是用CancellationTokenSource对象,

            private CancellationTokenSource token = null;

    //停止计算按钮 

    private void button1_Click(object sender, RoutedEventArgs e) { token.Cancel(); }
       //主要工作函数
    private Task<int> Dowork(IProgress<int> progress,CancellationToken token) { return Task<int>.Run(async () => { int sum = 0; for (int i = 0; i < 100; i++) { progress.Report(i); sum += i;    await Task.Delay(10);//为了增加效果,延迟10毫米 token.ThrowIfCancellationRequested();//取消时抛出异常 } return sum; }); }
    //开始计算按钮
    private async void button_Click(object sender, RoutedEventArgs e) { token = new CancellationTokenSource(); textBlock.Text = "正在计算。。。。"; var result = Dowork(progress,token.Token); try { var r= await result;//只有在 await 时才会捕获异常。   textBlock.Text ="最终结果:"+ r.ToString();//直接显示结果,这是跨线程的交给WPF完成 } catch (Exception ex) { textBlock.Text = ex.Message; return; } }
      IProgress<int> progress = null;
            public MainWindow()
            {
                InitializeComponent();
    
                this.DataContext = this;
            //初始化进度对象,把进度显示用lambda注入
                progress = new Progress<int>((x) => {
    
                    textBlock.Text = x + "%";
                });
            }
  • 相关阅读:
    Django——不同版本
    04爬取拉勾网Python岗位分析报告
    24 两两交换链表中的节点
    UniGUI学习之UniImage(39)
    Delphi7开发简单文件传输
    Javaday03(补充day02运算符,流程控制)
    java中代码块,构造方法和普通方法的代码执行顺序
    +=隐式类型转换
    关于switch中的default
    Java操作JSON数据(5)--jettison操作JSON数据
  • 原文地址:https://www.cnblogs.com/lunawzh/p/5876215.html
Copyright © 2011-2022 走看看