C#~非同期プログラミング続き~.net4.5主推await&async応用

6546 ワード

以前は2つの非同期プログラミングに関する文章を書いたことがありますが、詳細はC#~非同期プログラミングC#~非同期プログラミングのプロジェクトでの使用に入ることができます.
.Netの各バージョンには自分の主推技术があります.NET1.1の依頼、.NET2.0の中の汎型,.NET3.0の中のLinq,.NET4.0のDynimacは.NET4.5の中で主に非同期プログラミングを出して、非同期プログラミングを実現する簡単な方式はawaitとasyncキーワードを使って、新しい.Net管理クラスライブラリでは、この2つのキーワードが大幅に使用されています.私たちはvs 2010のパッチ追加とvs 2012で使用することができます.マイクロソフトの戦場では、非同期プログラミングが盛んに行われているのを見たことがありません.net4.5以降、非同期化の方法が必要となり、同期と非同期の2つのバージョンが実現され、開発者に大きな便利さをもたらします.
次に、awaitとasyncの使用方法を2つの例を挙げて再説明する.
リモート画像を取得し、ブラウザで応答します.
#region        (           )
        public async Task<ActionResult> AwaitFile()
        {
            var responseHtml = await GetResponseStream("http://static.xuexiba.com/uploadfile/UserInfo/Avatar/201311/1302844759237319155175.jpg");
            return File(responseHtml, "image/jpeg");
        }

        private async Task<Stream> GetResponseStream(string url)
        {
            return await GetResponseContentAsync(url);
        }

        private async Task<Stream> GetResponseContentAsync(string url)
        {
            var httpClient = new System.Net.Http.HttpClient();
            var response = await httpClient.GetAsync(url);
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                return await response.Content.ReadAsStreamAsync();
            }
            else
            {
                return null;//error
            }
        }

        #endregion

二リモートHTMLファイルを取得し、ブラウザで応答する
#region       (           )

        public async Task<ActionResult> AwaitHtml()
        {
            var responseHtml = await GetResponseHtml("http://www.sina.com");
            return Content(responseHtml);
        }

        private async Task<string> GetResponseHtml(string url)
        {
            return await GetResponseStringAsync(url);
        }

        private async Task<string> GetResponseStringAsync(string url)
        {
            var httpClient = new System.Net.Http.HttpClient();
            var response = await httpClient.GetAsync(url);
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                return await response.Content.ReadAsStringAsync();// await     , UI        ,     ,       !
            }
            else
            {
                return null;//error
            }
        }
        #endregion

実行後、私たちはそれが正常に出力されていることを見ることができますが、その実行の背後には、WWWのメインスレッドで実行されているのではなく、新しいスレッドを非同期で開いていることを実現していることが明らかではありません.これが重要です.それは、WWWの応答能力を高めることです.つまり、プログラムのスループットを高めることです.