zoukankan      html  css  js  c++  java
  • 异步读取文件

    异步读取文件,读取完成之后触发事件,通知主线程。主线程与读取文件的线程互相独立。
    代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Diagnostics;
    using System.Threading;

    namespace ExToDB.FileTransfer
    {
        
    /// <summary>
        
    /// 异步读取文件
        
    /// </summary>
        public class AsyncProcessor
        {
            
    private Stream inputStream;

            
    public Stream InputStream
            {
                
    get { return inputStream; }
                
    set { inputStream = value; }
            }

            
    // 每次读取块的大小
            private int bufferSize = 2048;

            
    public event ReturnEndEvent IsReturnEvent;

            
    protected void OnIsReturnEvent()
            {
                
    if (IsReturnEvent != null)
                    IsReturnEvent(
    thisnew ReturnEndReadEventargs(true));
            }

            
    public int BufferSize
            {
                
    get { return bufferSize; }
                
    set { bufferSize = value; }
            }

            
    // 容纳接收数据的缓存
            private byte[] buffer;

            
    public AsyncProcessor(string fileName)
            {
                buffer 
    = new byte[bufferSize];

                
    // 打开文件,指定参数为true以提供对异步操作的支持
                inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true);
            }

            
    /// <summary>
            
    /// 开始读取
            
    /// </summary>
            public void StartProcess()
            {
                
    // 开始异步读取文件,填充缓存区
                inputStream.BeginRead(buffer, 0, buffer.Length, OnCompletedRead, null);
            }

            
    private void OnCompletedRead(IAsyncResult asyncResult)
            {
                
    // 已经异步读取一个 块 ,接收数据
                int bytesRead = inputStream.EndRead(asyncResult);

                
    // 如果没有读取任何字节,则流已达文件结尾
                if (bytesRead > 0)
                {
                    
    // 暂停以模拟对数据块的处理
                    Debug.WriteLine("   异步线程:已读取一块");
                    Thread.Sleep(TimeSpan.FromMilliseconds(
    20));

                    
    // 开始读取下一块
                    inputStream.BeginRead(buffer, 0, buffer.Length, OnCompletedRead, null);
                }
                
    else
                {
                    
    // 结束操作
                    Debug.WriteLine("   异步线程:读取文件结束");
                    
    //读完,触发事件
                    OnIsReturnEvent();
                    
    //inputStream.Close();
                }
            }
        }


        
    public class ReturnEndReadEventargs : EventArgs
        {
            
    private bool isReturn;

            
    public ReturnEndReadEventargs(bool isReturn)
            {
                
    this.isReturn = isReturn;
            }
            
    public bool IsReturn
            {
                
    get { return isReturn; }
                
    set { isReturn = value; }
            }
        }

        
    public delegate void ReturnEndEvent(object sender, ReturnEndReadEventargs args);
    }
  • 相关阅读:
    TCP/IP,HTTP,HTTPS,WEBSocket协议
    mysql优化
    PHP基础算法
    php----函数大全
    面试题总结101-)
    扫描一个目录下的所有文件,根据这些文件的创建日期生成一个文件夹,然后把这些文件移入这个文件夹下面
    对执行文件下的文件按照时间
    [合集]解决Python报错:local variable 'xxx' referenced before assignment
    python 函数私有方法
    去哪儿面试题- 一组描述由人组成的网络的测试用例校验是否联通
  • 原文地址:https://www.cnblogs.com/csharponworking/p/1643803.html
Copyright © 2011-2022 走看看