비동기식과 대기 (async와 await)

6475 단어
에 있습니다.Net 4.5에서는 async와 await 두 키워드를 통해 새로운 작업 기반 비동기 프로그래밍 모델(TAP)을 도입했다.이런 방식에서 유사한 동기화 방식을 통해 비동기 코드를 작성할 수 있어 비동기 프로그래밍 모델을 크게 간소화시켰다.간단한 인스턴스는 다음과 같습니다.
static async void DownloadStringAsync2(Uri uri)
    {
        var webClient = new WebClient();
        var result = await webClient.DownloadStringTaskAsync(uri);
        Console.WriteLine(result);
    }

이전의 방식은 다음과 같다.
static void DownloadStringAsync(Uri uri)
    {
        var webClient = new WebClient();
        webClient.DownloadStringCompleted += (s, e) =>
            {
                Console.WriteLine(e.Result);
            };
        webClient.DownloadStringAsync(uri);
    }

아마도 앞의 이 예는 async와 await가 가져온 우월성을 나타내기에는 부족할 것이다. 아래의 이 예는 훨씬 뚜렷하다.
public void CopyToAsyncTheHardWay(Stream source, Stream destination)
    {
        byte[] buffer = new byte[0x1000];
        Action readWriteLoop = null;
        readWriteLoop = iar =>
        {
            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)
                        {
                            return;
                        }
                        iar = destination.BeginWrite(buffer, 0, numRead,
                            writeResult =>
                            {
                                if (writeResult.CompletedSynchronously) return;
                                destination.EndWrite(writeResult);
                                readWriteLoop(null);
                            }, null);
                        if (!iar.CompletedSynchronously) return;
                        destination.EndWrite(iar);
                        break;
                }
            }
        };
        readWriteLoop(null);
    }

    public async Task 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);
        }
    }

Microsoft의 공식 사이트인 Visual Studio Asynchronous Programming을 참조하십시오. 공식 문서인 Task-Based Asynchronous Pattern Overview는 매우 상세하게 소개했고 Visual Studio에 있는 CSharp Language Specification에도 설명이 있습니다.
 
출처:http://blog.csdn.net/wulex/article/details/73499500

좋은 웹페이지 즐겨찾기