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);
    }
  • 相关阅读:
    .net core 3.1 新增过滤器(Filter)和拦截器(LogInterceptor)
    .net core 3.1 新增log4net 和 NLog
    .net core 3.1 jwt token授权
    IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬
    IdentityServer4 之Client Credentials走起来
    Hive 窗口函数sum() over()求当前行和前面n条数据的和
    机器学习-线性规划(LP)
    机器学习-KNN算法
    flume整合kafka
    学习kafka自己发生的几个小错误记录
  • 原文地址:https://www.cnblogs.com/csharponworking/p/1643803.html
Copyright © 2011-2022 走看看