在WPF中使用C#6.0新特性async与await

原创 2017年01月11日 11:07:45

C#6.0特性:点击打开链接

C#7.0特性:点击打开链接

在C#6.0中 使用async与await 关键字很容易的实现异步编程,而且代码可读性比较高,很容易理解。这里举例的是从数据库中读取10w行数据。 下面看代码:

xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="800">
    <Grid>
        <StackPanel Margin="10">
            <TextBox x:Name="tb" Width="600" Height="40"></TextBox>
            <GroupBox Header="加载数据">
                <DataGrid x:Name="dg" Margin="20" Width="600" Height="500" AutoGenerateColumns="True">
                </DataGrid>
            </GroupBox>
            <ProgressBar x:Name="pb" Width="500" Height="30" IsIndeterminate="False" Minimum="0" Maximum="100"></ProgressBar>
            <TextBlock x:Name="tbTime"></TextBlock>
            <Button x:Name="btnClick" Width="120" Height="30" Content="click" Click="btnClick_Click"></Button>
        </StackPanel>
    </Grid>
</Window>

布局很简单,使用tb来显示异步开始与结束;使用Datagrid 来承载数据;pb显示进度条;tbTimer来显示计算的耗时时间。读取数据:

 /// <summary>
        /// 当前线程调度器
        /// </summary>
        private readonly Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;


  /// <summary>
        /// 读取数据
        /// </summary>
        public string SlowDude()
        {
            // 查询数据到DataSet
            DataSet dt = DbHelperSQL.ExecuteDataSet("select * from DevelopRecord", null);
            this._dispatcher.BeginInvoke(new Action(() =>
            {
                dg.ItemsSource = dt.Tables[0].DefaultView;
            }));
            return "";
        }

如果不使用异步方式,直接调用SlowDude方法会出现界面卡顿,用户体验不是很好。读取数据异步方法:

   /// <summary>
        /// 异步读取数据
        /// </summary>
        public async void SlowDudeAsync()
        {
            var slowTask = Task<string>.Factory.StartNew(() => SlowDude());
            tb.Text = "开始异步\r\n";
            pb.IsIndeterminate = true;
            // 计算耗时
            System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();
            stop.Start();
            await slowTask;
            tb.Text += "异步结束";
            pb.IsIndeterminate = false;
            stop.Stop();
            tbTime.Text = "耗时:" + stop.ElapsedMilliseconds + "ms";
        }

这里的async关键字标示SlowDudeAsync为异步方法,该方法不仅可以返回void也可以返回Task<TResult>类型,例如:

     public async Task<string> GetStrAsync(Uri uri)
        {
            using (var client = new HttpClient())
            {
                var str = await client.GetStringAsync(uri).ConfigureAwait(false);
                return str;
            }
        }

GetStrAsync方法返回string类型的Task,获取返回结果:

Task<string> task = GetStrAsync(new Uri("http://www.baidu.com"));
var result = task.Result;

点击加载调用加载事件:

   private void btnClick_Click(object sender, RoutedEventArgs e)
        {
            SlowDudeAsync();
        }

显示效果:




Global.asax中的Application_Error事件不执行

      最近在做一个asp.net mvc的项目,既然是一个实际项目怎么能够没有异常处理和相应的日志记录呢。因此决定在Global.asax中的Application_Error事件中记录事件日志...

System.Threading.Tasks.TaskCanceledException: 已取消一个任务

Exception: System.AggregateException: 发生一个或多个错误。 ---> System.Threading.Tasks.TaskCanceledException: ...

async await 使用demo(WPF C#)

  • 2017年10月31日 21:13
  • 110KB
  • 下载

[你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单

本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单  async和await关键字剖析 ...

VS2015使用C#6.0中的那些新特性

1、自动属性的增强1.1、自动属性初始化 (Initializers for auto-properties)C#4.0下的果断实现不了的。 只要接触过C#的肯定都会喜欢这种方式。真是简洁方便呀...
  • WuLex
  • WuLex
  • 2017年06月20日 20:59
  • 442

[C#] .NET4.0中使用4.5中的 async/await 功能实现异步

在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用。这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出...
  • qiujuer
  • qiujuer
  • 2014年08月12日 11:00
  • 6373

使用 Async 和 Await 的异步编程(C# 和 Visual Basic)

为什么使用Asynchrony? 使用异步编程时,可以在可能需要长时间运行的代码指定点处理挂起,当程序的其他部分无法继续时。 此技术来避免可能的性能瓶颈并增强应用程序的总体响应能力。 Asynchro...
  • keymo_
  • keymo_
  • 2012年11月08日 12:01
  • 4250

C#6.0新特性

  • 2016年09月03日 13:51
  • 36KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在WPF中使用C#6.0新特性async与await
举报原因:
原因补充:

(最多只允许输入30个字)