async、await

这俩关键字是在Windows 8开发中经常看到然后学习了学习。

貌似需要.NET Framework 4.5以上版本的支持,其作用是简化需要异步执行的代码的编写。

在以前,如果需要执行一些比较耗时的工作,但是还要保证界面能够继续响应用户的输入,以及随时反馈给用户输出,需要新建线程来完成这种类型的操作。

(以下将在WPF窗口项目中进行示例,其他地方使用类似)

QQ截图20130729100228

比如如果想在界面上显示实时的时间,之前需要使用多线程:

public MainWindow()
{
    InitializeComponent();

    //新开启一个线程来处理时间显示
    Thread t = new Thread(new ThreadStart(ShowTime));
    t.IsBackground = true;
    t.Start();
}
 
//无参数无返回值的委托原型
delegate void VoidDelegate();
private void ShowTime()
{
    while (true)
    {
        //请求对UI线程上显示时间控件的调用
         tbk_time.Dispatcher.BeginInvoke(new VoidDelegate(()=>
            {
                //设置时间显示值
                  tbk_time.Text = DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss");
            }));
        Thread.Sleep(1000);
    }
}

而如果使用新的async、await关键词,代码将会简化不少:

public MainWindow()
{
    InitializeComponent();

    //调用一个异步执行的方法
     ShowTimeNew();
}

//该方法通过被async修饰转换为异步执行
private async void ShowTimeNew()
{
    while (true)
    {
        //可以不写请求直接修改UI控件属性值
          tbk_time.Text = DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss");

        //新的延时方法,该方法同样为异步方法,使用await关键词来等待异步方法的执行完成
          await Task.Delay(1000);
    }
}

async用来标记一个方法需要在本线程中异步执行,在异步方法中,如果需要调用其他异步方法并需要等待其返回后再做下一步处理操作,使用await来标记需要等待一个异步方法的执行完成。await是一个上下文关键词,只能使用在被async标记的方法中。

下面来介绍一下如何停止一个async任务:

//用于传递终止任务的消息的令牌
CancellationTokenSource cancel;

public MainWindow()
{
    InitializeComponent();
    
    //初始化令牌
    cancel = new CancellationTokenSource();

    //调用一个异步执行的方法
    ShowTimeNew(cancel);
}

//该方法通过被async修饰转换为异步执行
private async void ShowTimeNew(CancellationTokenSource cancel)
{
    try
    {
        while (true)
        {
            //可以不写请求直接修改UI控件属性值
              tbk_time.Text = DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss");

            //新的延时方法,该方法同样为异步方法,使用await关键词来等待异步方法的执行完成
              //第一个参数是延时毫秒数,第二个参数是传入传递终止任务消息的令牌
              await Task.Delay(1000, cancel.Token);

            //处理任务终止消息
              if (cancel.IsCancellationRequested == true)
            {
                //这里就是跳出循环,停止时间的显示
                break;
            }
        }
    }
    catch { }
    finally
    {
        //终止任务时经常会发生异常,目前还不知道如何避免
         //只能通过try catch来处理一下
         tbk_time.Text = "已停止";
    }
}

private void btn_pause_Click(object sender, RoutedEventArgs e)
{
    if (cancel != null)
    {
        //发出取消任务的请求
         cancel.Cancel();
        btn_pause.Content = "开始";
        cancel = null;
    }
    else
    {
        //重新开始任务
         cancel = new CancellationTokenSource();
        ShowTimeNew(cancel);
        btn_pause.Content = "暂停";
    }
}

这里只是一个简单的小示例,实际上异步任务可以执行处理各种需要等待耗时的任务,一个例子就是比如在使用WCF时等待一个服务器的数据返回,这里就可以使用async并在里面使用await进行同步处理。新的异步处理方式主要是让并行开发更简单。

posted @ 2013-07-29 10:06  不是豆豆  阅读(747)  评论(1编辑  收藏  举报
友情链接:迷途