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

本文介绍了如何在WPF应用中利用C#6.0的async和await关键字进行异步编程,以提高代码可读性和效率。通过示例展示了从数据库读取大量数据的异步操作。
摘要由CSDN通过智能技术生成

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();
        }


显示效果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值