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();
}
显示效果: