异步学习

Posted lunawzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步学习相关的知识,希望对你有一定的参考价值。

多线程和异步的学习中发现,多任务处理发挥资源最大利用率时可以使用,还有就是在界面长期等待时可以使用,这样用户使用更加方便,软件更加专业。

在做软件不可滥用异步,因为常常发现有 一般的方法比异步更有效。

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

例子: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 + "%";
            });
        }

 

以上是关于异步学习的主要内容,如果未能解决你的问题,请参考以下文章

从片段中调用分离的异步任务类

Android 我应该在异步任务中将片段作为弱引用传递吗?

屏幕方向期间片段内的异步任务

我应该在 Fragment 中的啥生命周期状态下执行异步任务?

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

javascript 异步片段