.net framework 4.5 异步初体验(实习)

良好的用户体验对于软件的成功越来越重要,当然不仅仅是软件(比如苹果)。到底什么样的软件才能让人用着舒服呢?

排除网络,硬件,只从软件本身角度来说,最重要的也许就是及时响应了。ui层我们可以用JavaScript的Ajax,后台可以

多线程。现在有很多成熟的JavaScript脚本库已经封装好了Ajax的异步方法,我们用起来相对还是比较方便的,但在过去

几年里要是在后台想使用异步总是特别的小心,不好测,不好调,还有未知,个人来说,能不用就不用。。。

 

异步是什么呢?打个比方说,网页上有一个按钮(button),这个按钮绑定的事件(click_event)是要到数据库中取大量的数据,当

button的click事件被触发时,如果是同步,则在数据库返回数据前,我们会失去UI的操作权,nothing to do but wait;而异步

则是,我告诉程序,你去数据库取数据,至于你什么时候取回来我不管,我可以继续做我的事儿,只要完成后告诉我一声就行

了。

 

下载举个小例子,一个CopyTo方法

4.5以前要实现异步

public static IAsyncResult BeginCopyTo(Stream source, Stream destination)
{
  var tcs = new TaskCompletionSource();
 
  byte[] buffer = new byte[0x1000];
  Action<IAsyncResult> readWriteLoop = null;
  readWriteLoop = iar =>
  {
    try
    {
      for (bool isRead = iar == null; ; isRead = !isRead)
      {
        switch (isRead)
        {
          case true:
            iar = source.BeginRead(buffer, 0, buffer.Length, readResult =>
            {
              if (readResult.CompletedSynchronously) return;
              readWriteLoop(readResult);
            }, null);
            if (!iar.CompletedSynchronously) return;
            break;
 
          case false:
            int numRead = source.EndRead(iar);
            if (numRead == 0)
            {
              tcs.TrySetResult(true);
              return;
            }
            iar = destination.BeginWrite(buffer, 0, numRead, writeResult =>
            {
              try
              {
                if (writeResult.CompletedSynchronously) return;
                destination.EndWrite(writeResult);
                readWriteLoop(null);
              }
              catch(Exception e) { tcs.TrySetException(e); }
            }, null);
            if (!iar.CompletedSynchronously) return;
            destination.EndWrite(iar);
            break;
          }
        }
      }
    }
    catch(Exception e) { tcs.TrySetException(e); }
  };
  readWriteLoop(null);
 
  return tcs.Task;
}
 
public static void EndCopyTo(IAsyncResult asyncResult)
{
  ((Task)asyncResult).Wait();
}
 

4.5中

public static async void CopyToAsync(Stream source, Stream destination)
{
  byte[] buffer = new byte[0x1000];
  int numRead;
  while((numRead = await source.ReadAsync(buffer, 0, buffer.Length)) > 0)
  {
    await destination.WriteAsync(buffer, 0, numRead);
  }
}

是不是太简单了,就是在同步方法里加上几个关键字async,await

posted @ 2012-06-28 10:57  湛然  阅读(857)  评论(0编辑  收藏  举报