zoukankan      html  css  js  c++  java
  • C# 异步编程小结

    1. APM 异步编程模型,Asynchronous Programming Model
    2. EAP 基于事件的异步编程模式,Event-based Asynchronous Pattern
    3. TAP 基于任务的异步编程模式,Task-based Asynchronous Pattern

    APM(早期的异步编程模型)


    该编程模型使用BeginXXX,EndXXX方法和IAsyncResult接口

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    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 AsyncProgramTest
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public class RequestState
            {
                // This class stores the State of the request.
                const int BUFFER_SIZE = 1024;
                public StringBuilder requestData;
                public byte[] BufferRead;
                public HttpWebRequest request;
                public HttpWebResponse response;
                public Stream streamResponse;
                public RequestState()
                {
                    BufferRead = new byte[BUFFER_SIZE];
                    requestData = new StringBuilder("");
                    request = null;
                    streamResponse = null;
                }
            }
            public MainWindow()
            {
                InitializeComponent();
    
    
            }
            const int BUFFER_SIZE = 1024;
            private void button_Click(object sender, RoutedEventArgs e)
            {
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.cnblogs.com/");
    
                RequestState myRequestState = new RequestState();
                myRequestState.request = myHttpWebRequest;
                IAsyncResult result =(IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);
    
            }
            private void RespCallback(IAsyncResult asynchronousResult)
            {
                RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
                HttpWebRequest myHttpWebRequest = myRequestState.request;
                myRequestState.response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult);
    
                // Read the response into a Stream object.
                Stream responseStream = myRequestState.response.GetResponseStream();
                myRequestState.streamResponse = responseStream;
    
                // Begin the Reading of the contents of the HTML page and print it to the console.
                IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
                return;
    
            }
            private static void ReadCallBack(IAsyncResult asyncResult)
            {
                RequestState myRequestState = (RequestState)asyncResult.AsyncState;
                Stream responseStream = myRequestState.streamResponse;
                int read = responseStream.EndRead(asyncResult);
                // Read the HTML page and then print it to the console.
                if (read > 0)
                {
                    myRequestState.requestData.Append(Encoding.UTF8.GetString(myRequestState.BufferRead, 0, read));
                    IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
                    return;
                }
                else
                {
                    Console.WriteLine("
    The contents of the Html page are : ");
                    if (myRequestState.requestData.Length > 1)
                    {
                        string stringContent;
                        stringContent = myRequestState.requestData.ToString();
                        Console.WriteLine(stringContent);
                    }
                    Console.WriteLine("Press any key to continue..........");
                    Console.ReadLine();
    
                    responseStream.Close();
                }
            }
        }
    }
    

    EAP(基于事件的异步编程模式)


    TAP(基于任务的异步编程模式)


      private async void button_Click(object sender, RoutedEventArgs e)
            {
                System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
                var msg = await httpClient.GetAsync("http://www.cnblogs.com/");
                var htmlString=await msg.Content.ReadAsStringAsync();
                //todo process htmlstring 
            }
    

     EAP=>TAP(基于事件的异步编程模式转化为基于任务的异步编程模式)


    APM=>TAP(BeginXXX转化为基于任务的异步编程模型)


         private async  void button_Click(object sender, RoutedEventArgs e)
            {
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.cnblogs.com/");
    
                var maskTask = Task.Factory.FromAsync<WebResponse>(myHttpWebRequest.BeginGetResponse,myHttpWebRequest.EndGetResponse,  null, TaskCreationOptions.None);
                WebResponse webResponse = await maskTask;
                Stream responseStream = webResponse.GetResponseStream();
    
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    var htmlString =await reader.ReadToEndAsync();
               
                    Console.WriteLine(htmlString);
                //to do process html String 
    
                }
            }
    

     参考文章:http://www.dotblogs.com.tw/yc421206/archive/2013/08/06/113555.aspx

  • 相关阅读:
    fluentValidation集成到autofac
    javascript中的this
    Android环境配置Sencha Touch
    PHP上传图片如何防止图片木马?
    mysql 修改字段长度
    mysql 截取字符
    php 获取文件后缀名
    mysql 导入导出数据库、数据表
    Nginx下修改php.ini后重新加载配置文件命令
    ubuntu 12.04 LTS(64位)安装apache2
  • 原文地址:https://www.cnblogs.com/LittleFeiHu/p/4841002.html
Copyright © 2011-2022 走看看