读书人

关于多线程写日志。 下面这段代码不太

发布时间: 2012-03-25 20:55:17 作者: rapoo

关于多线程写日志。 下面这段代码不太明白,求解释

C# code
    public class MTWFile    {        private string _fileName;        private static Dictionary<long, long> lockDic = new Dictionary<long, long>();        /// <summary>        /// 获取或设置文件名称          /// </summary>        public string FileName        {            get { return _fileName; }            set { _fileName = value; }        }        /// <summary>          /// 构造函数          /// </summary>          /// <param name="byteCount">每次开辟位数大小,这个直接影响到记录文件的效率</param>          /// <param name="fileName">文件全路径名</param>          public MTWFile(string fileName)        {            _fileName = fileName;        }        /// <summary>          /// 创建文件          /// </summary>          /// <param name="fileName"></param>          public void Create(string fileName)        {            if (!System.IO.File.Exists(fileName))            {                using (System.IO.FileStream fs = System.IO.File.Create(fileName))                {                    fs.Close();                }            }        }        /// <summary>          /// 写入文本          /// </summary>          /// <param name="content">文本内容</param>          private void Write(string content, string newLine)        {            if (string.IsNullOrEmpty(_fileName))            {                throw new Exception("FileName不能为空!");            }            using (System.IO.FileStream fs = new System.IO.FileStream(                _fileName,                System.IO.FileMode.OpenOrCreate,                System.IO.FileAccess.ReadWrite,                System.IO.FileShare.ReadWrite, 8,                System.IO.FileOptions.Asynchronous))            {                Byte[] dataArray = System.Text.Encoding.Default.GetBytes(content + newLine);                bool flag = true;                long slen = dataArray.Length;                long len = 0;                while (flag)                {                    try                    {                        if (len >= fs.Length)                        {                            fs.Lock(len, slen);                            lockDic[len] = slen;                            flag = false;                        }                        else                        {                            len = fs.Length;                        }                    }                    catch (Exception ex)                    {                        while (!lockDic.ContainsKey(len))                        {                            len += lockDic[len];                        }                    }                }                fs.Seek(len, System.IO.SeekOrigin.Begin);                fs.Write(dataArray, 0, dataArray.Length);                fs.Close();            }        }        /// <summary>        /// 写入文件内容        /// </summary>        /// <param name="content"></param>        public void WriteLine(string content)        {            this.Write(content, System.Environment.NewLine);        }        /// <summary>          /// 写入文件          /// </summary>          /// <param name="content"></param>          public void Write(string content)        {            this.Write(content, "");        }    }


[解决办法]
用不到那么麻烦把,用队列解决,
写到队列里,然后有专门线程从队列中读取并写入文件。

读书人网 >C#

热点推荐