http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4669|回复: 4

[学生提问] 多线程IO操作疑问

[复制链接]
发表于 2016-7-16 21:55:48 | 显示全部楼层 |阅读模式
老师,请问在多线程中这样操作IO会发生同步占用的情况吗?

IOHelper io = new IOHelper();
io.Log("这里写内容");

实例化IOHelper对象是在多线程外面还是每条线程都实例化一个对象,如果加lock肯定效果大打折扣,我现在是加了lock的,之前没加有些数据写不进去,后来debug提示占用的状态。

不是很熟悉这块,请老师给予帮助,谢谢!


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2016-7-18 10:06:15 | 显示全部楼层
只要操作相同的文件都会存在这样的问题,追加的方法写入,非独占模式查看,不会存在同时使用的情况,其他情况应该都会。这个枷锁也是有必要的,毕竟IO的读写也是有性能问题的。想更安全更快,要从策略上入手,比较怎么减少同时操作一个文件的可能,分批写,分开写等等
 楼主| 发表于 2016-7-18 11:10:55 | 显示全部楼层
站长苏飞 发表于 2016-7-18 10:06
只要操作相同的文件都会存在这样的问题,追加的方法写入,非独占模式查看,不会存在同时使用的情况,其他情 ...

昨天在博客园有看到这样一篇文章,大概的意思是将内容存起来,超过多少行,在lock写文件里
发表于 2016-7-18 12:34:11 | 显示全部楼层
renhongwei 发表于 2016-7-18 11:10
昨天在博客园有看到这样一篇文章,大概的意思是将内容存起来,超过多少行,在lock写文件里

这个其实就是批量处理,先写到内存里,也可以写到缓存里,等达到量了一并存储,目的就是减少IO的写入次数
发表于 2016-7-18 12:39:24 | 显示全部楼层
给你一个概念性的例子

[C#] 纯文本查看 复制代码
  List<string> strlist = new List<string>();
        /// <summary>
        /// 写入文件
        /// </summary>
        /// <param name="msg">要写入的内容</param>
        /// <returns>0成功,其他为操作失败</returns>
        public int Writer(string msg)
        {
            strlist.Add(msg);
            //超过10000行再写入
            if (strlist.Count > 10000)
            {
                using (StreamWriter sr = new StreamWriter("path"))
                {
                    //处理写入 strlist
                }
            }
            return 1;
        }
        /// <summary>
        /// 写入文件
        /// </summary>
        public void LastWriter(string msg)
        {
            using (StreamWriter sr = new StreamWriter("path"))
            {
                //处理写入 strlist
            }

        }



您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-23 12:06

© 2014-2021

快速回复 返回顶部 返回列表