1. 程式人生 > >非同步方法讀取網路路徑 非同步讀取檔案字元流

非同步方法讀取網路路徑 非同步讀取檔案字元流

1.非同步讀取地址下資訊

        public void T_Invoke()
        {
            var request = WebRequest.Create("http://www.sina.com.cn");
            //io  yibu
            request.BeginGetRequestStream(AsyncCallbackImpl, request);
        }
        public void AsyncCallbackImpl(IAsyncResult ar)
        {
            WebRequest request = ar.AsyncState as WebRequest;
            var reponse = request.EndGetResponse(ar);
            var stream = request.GetRequestStream();
            using (StreamReader reader=new StreamReader(stream))
            {
                //values
                string str=reader.ReadLine();
            }
        }

2.非同步時間  讀取路徑下檔案字元流資訊

        public event EventHandler<ReturnEndReadEventargs> IsReturnEvent;

        FileStream InputStream;
        StringBuilder ReadValue;
        byte[] buffer;
        public string ReadFileAsync(string fileName)
        {
            ReadValue = new StringBuilder();
            int BufferSize=0;
            buffer = new byte[BufferSize];

            InputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read,
                FileShare.Read, BufferSize, useAsync: true);
            InputStream.BeginRead(buffer, 0, buffer.Length, OnCompleteRead, null);
            //InputStream.write
            return ReadValue.ToString();
        }

        public void OnCompleteRead(IAsyncResult asyncResult)
        {
            //非同步讀取一個快,接收資料
            int bytesRead = InputStream.EndRead(asyncResult);
            //如果沒有任何位元組,則流已達檔案結尾
            if (bytesRead > 0)
            {
                //暫停以對模擬對資料塊的處理
                Debug.WriteLine("非同步執行緒:已讀取一塊內容");
                var datastr = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                ReadValue.Append(datastr);
                Thread.Sleep(TimeSpan.FromMilliseconds(20));
                //開始讀取下一塊
                InputStream.BeginRead(buffer, 0, buffer.Length, OnCompleteRead, null);
            }
            else
            {
                //操作結束
                Debug.WriteLine("   非同步執行緒:讀取檔案結束");
                //event必須方法裡呼叫
                OnIsReturnEvent();
            }
        }
        protected virtual void OnIsReturnEvent()
        {
            IsReturnEvent?.Invoke(this, new ReturnEndReadEventargs(true, ReadValue.ToString()));
            //IsReturnEvent(this, new ReturnEndReadEventargs(true, ReadValue.ToString()));
        }
        public class ReturnEndReadEventargs : EventArgs
        {
            public ReturnEndReadEventargs(bool isReturn, string value)
            {
                IsReturn = isReturn;
                ReadValue = value;
            }
            public string ReadValue { get; set; }
            public bool IsReturn { get; set; }
        }