错误1.
用async 关键字修饰的方法一旦调用,就会自动在一个工作者线程上执行。— 方法在 调用者线程上执行,并不是在工作者线程执行。仅仅使用async关键字,改变不了代码在哪里执行,只有方法的实现代码决定是否启动任何异步工作
错误2.
await关键字造成当前线程阻塞,直到被等待的任务完成。要阻塞当前线程直到任务完成,应该调用wait()方法。
await关键字对他后面的表达式进行求值,该表达式一般是Task或Task,为最终任务添加延续,然后立即将控制返回调用者。
异步工作完成后的某个时间,从await表达式后的控制点恢复运行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
btnRun.Click += DoClick;
}
private async void DoClick(object sender, RoutedEventArgs e)
{
tbShow.Text = "Started";
var m = await Task.Run<string>(
()=>
{
for (int i = 100; i > 0; i--)
{
Dispatcher.InvokeAsync(() =>
tbShow.Text = i.ToString()
);
Thread.Sleep(1000);
}
return "finished";
}
);
tbShow.Text=m;
}
}
}