关闭

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

522人阅读 评论(1) 收藏 举报
分类:

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:103211次
    • 积分:1375
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:1篇
    • 评论:23条
    文章分类
    最新评论