WPF 异步执行方法后对 UI 进行更新的几种方法

使用 async/await 的情况:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).IsEnabled = false;
    const string do7zCmd = @"a D:\x7zaTest.7z"
        + @" E:\WpfApp1\WpfApp1\bin\Debug\*.dll"
        + @" E:\WpfApp1\WpfApp1\bin\Debug\*.xml"
        ;

    tex1.Text = "Running...";
    tex1.Focus();

    var ret = await Task.Run(() => X7za.Do7z(do7zCmd));

    //更新UI线程的操作
    tex1.Text += "\r\n" + ret + "\r\n" + do7zCmd;
    (sender as Button).IsEnabled = true;
}

在不使用 async/await 的情况下有 3 种办法:

private void Button_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).IsEnabled = false;
    const string do7zCmd = @"a D:\x7zaTest.7z"
        + @" E:\WpfApp1\WpfApp1\bin\Debug\*.dll"
        + @" E:\WpfApp1\WpfApp1\bin\Debug\*.xml"
        ;

    //更新UI线程的操作
    var f = new Action<int>(ret =>
    {
        tex1.Text += "\r\n" + ret + "\r\n" + do7zCmd;
        (sender as Button).IsEnabled = true;
    });

    //1.BackgroundWorker - 推荐,有进度报告机制,对 UI 的操作在创建线程内
    var b = new BackgroundWorker();
    b.DoWork += (o, args) => args.Result = X7za.Do7z(do7zCmd);
    b.RunWorkerCompleted += (o, args) => f((int)args.Result);
    b.RunWorkerAsync();

    //2.委托异步执行 - 主要就是下面的 BeginInvoke 调用,
    //这是从 BackgroundWorker 的源码里挖出来的用法。
    //
    //这个片段对 UI 线程的操作是在别的线程通过 WPF
    //Application 对象的 Dispatcher 机制跨线程执行的。
    new Action(() =>
    {
        var ret = X7za.Do7z(do7zCmd);
        Application.Current.Dispatcher.Invoke(() => f(ret));
    }).BeginInvoke(null, null);

    //3.Task.Run - 很通俗的方法了。对 UI 的操作跟片段2一样。
    Task.Run(() =>
    {
        var ret = X7za.Do7z(do7zCmd);
        Application.Current.Dispatcher.Invoke(() => f(ret));
    });

    tex1.Text = "Running...";
    tex1.Focus();
}

就是酱紫。
推荐第一种,WinForm 程序也可以用。
 

转载于:https://my.oschina.net/qaqz111/blog/363165

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值