问题描述
描述:一个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();加上你的处理,写到文件里去