奇怪的线程读取问题?

问题描述

描述:一个ConsoleApplication,多线程环境下操作文件,但保证在任一时刻都只有一个线程执行SomeMethod成员函数。该函数首先将文件长度截为零,然后将对象Serialize到文件中。BUG:当Application运行中关闭Console窗体,文件的长度可能为零(有时正常,有时为零)。尝试解决办法:在函数中加入try,finally块,失败。在函数中加入Thread.BeginCriticalRegion()&Thread.EndCriticalRegion(),失败.问题:如果注释掉"stream.SetLength(0);"行,程序不会出现该BUG.我的理解是,当线程运行到serializer.Serialize函数的时候刚好碰到我关闭Console窗口,线程给强制退出,而stream还没来得及Write.如果修改该Bug可以在SetLength(0)前做一个备份,但我期望能有更好的解决办法。代码:publicstaticSomeMethod(){stream.SetLength(0);...serializer.Serialize(stream,src);...stream.Flush();}

解决方案

解决方案二:
tt!
解决方案三:
publicstaticSomeMethod(){lock(this){stream.SetLength(0);...serializer.Serialize(stream,src);...stream.Flush();}}这样可以吗?
解决方案四:
回复IThurricane:该成员函数为static,lock(this)无效。
解决方案五:
补充:用VS2005调试该Application时会出现该BUG.但直接运行该程序集时没出现(至少几十次都没有发现)
解决方案六:
AutoRestEvent
解决方案七:
Sorry,shoulebeAutoResetEvent
解决方案八:
up
解决方案九:
publicstaticSomeMethod(){try{stream.SetLength(0);...serializer.Serialize(stream,src);...}catch(Exceptionex){}finally{stream.Flush();}}这个每次都写到文件里的。可以不?
解决方案十:
我的意思是你要控制线程的同步,在关闭Console窗口前先SomeMethodThread.Join一下试试呢
解决方案十一:
还有就是你在你的程序里实现这个方发protectedvoidFinalize();加上你的处理,写到文件里去

时间: 2024-09-16 17:51:31

奇怪的线程读取问题?的相关文章

c++-【OpenCv&MFC】MFC中用子线程读取摄像头图像到Picture Control的问题~~~

问题描述 [OpenCv&MFC]MFC中用子线程读取摄像头图像到Picture Control的问题~~~ 如题,我想在程序中同时读取多个摄像头的数据到不同的PictureControl中,每个摄像头的读取工作都分别放在一个新的线程中执行,需要怎么实现?? 求各路大神帮忙写个Demo供学习学习~~~或者不行的话提供个思路也行~~~ 解决方案 把摄像头IP 和 PictureControl ID 还有主窗口句柄 封装到一个结构体,把这个参数传到你的多线程函数里面就可以为所欲为了 解决方案二: O

SQL Server 2000 如何锁定表中的行,使其他线程读取该行时候发生sql异常,不能读取?

问题描述 SQL Server 2000 如何锁定表中的行,使其他线程读取该行时候发生sql异常,不能读取?以及锁定之后如何对该行数据进行释放? 解决方案 只能通过transaction和lock让别人读取这行的时候等待.如果真要做...高一点山寨也不是不行,不过非常恶心.首先,得在一个大transaction里面,我假设你的C#层已经做了transaction了,然后可以:DECLARE @exists INTSELECT @exists = 1 FROM myTable WITH (NOLO

线程读取datagridview内容

问题描述 我在主窗体里有一个datagridview,里面完全空白.我在线程里读取SQL数据放在datagridview里面,然后想在这个线程里面对datagridview进行编辑.但是不知道如何读取内容,出错提示是"索引超出范围.必须为非负值并小于集合大小."我读取的是第一列数据,我在另外一个线程里面是可以读取的.但在取数据线程读取就失败.应该是委托的问题.我用委托操作datagridview添加列是没问题的.但是不知道如何读取上面的数据.方法一PublicDelegateSubDe

《Java特种兵》5.2 线程安全

本文是<Java特种兵>的样章,感谢博文视点和作者授权本站发布 接下来的内容都将基于多核处理器,因为单核处理器不会出现将要谈到的可见性问题,不过并不代表单核CPU上多个线程就没有一致性问题,因为CPU有时间片原则,还会有其他的一些问题,例如重排序. 本节的内容比较偏重于理论化,看过的同学应该知道这部分内容并不容易看懂.不过要学习并发编程就必然会涉及这方面的内容,所以我们一定要努力去学习,胖哥会尽量通过自己的理解,用一些相对简单的方式让大家得到一些感性认识,进一步的深入就得靠大家自己多去参看相关

《Java特种兵》5.2 线程安全(一)

接下来的内容都将基于多核处理器,因为单核处理器不会出现将要谈到的可见性问题,不过并不代表单核CPU上多个线程就没有一致性问题,因为CPU有时间片原则,还会有其他的一些问题,例如重排序. 本节的内容比较偏重于理论化,看过的同学应该知道这部分内容并不容易看懂.不过要学习并发编程就必然会涉及这方面的内容,所以我们一定要努力去学习,胖哥会尽量通过自己的理解,用一些相对简单的方式让大家得到一些感性认识,进一步的深入就得靠大家自己多去参看相关的资料了.  5.2.1 并发内存模型概述 前文中提到,为了提升性

编程-Android线程与ui绘制的问题

问题描述 Android线程与ui绘制的问题 当然知道只能在主线程更新UI,不过我有个非常费时的UI绘制操作(就是一堆自定义的view退出时保存在文件里,然后进入时读取文件绘制ui恢复界面,实测短板出现在view的绘制过程) 然后我一开始觉得只要View不添加就只是对象而已,然后尝试新开一个线程把这些控件new出来,然后在主线程addView,结果在我的平板(5.1.1)上完美运行,在手机(4.2.2)上闪退. 继续测试手机,新开一个线程,一个执行一句new一个edittext就崩溃,不过更加奇

多线程编程之四——线程的同步

八.线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决.例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误:又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过. 使隶属于同一进程的各

c#线程基础之线程控制

用ManualResetEvent和AutoResetEvent可以很好的控制线程的运行和线程之间的通信.msdn的参考为: http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent.aspx 下面我写个例子,这里模拟了一个线程更新数据,两个线程读取数据.

Win32下两种用于C++的线程同步类(上)

线程同步是多线程程序设计的核心内容,它的目的是正确处理多线程并发时的各种问题,例如线程的等待.多个线程访问同一数据时的互斥,防死锁等.Win32提供多种内核对象和手段用于线程同步,如互斥量.信号量.事件.临界区等.所不同的是,互斥量.信号量.事件都是Windows的内核对象,当程序对这些对象进行控制时会自动转换到核心态,而临界区本身不是内核对象,它是工作在用户态的.我们知道从用户态转换到核心态是需要以时间为代价的,所以如果能在用户态就简单解决的问题,就可以不必劳烦核心态了. 这里我要说的是两种用