奇怪的线程读取问题?

zquboy 2007-11-08 11:33:21
描述:
一个Console Application, 多线程环境下操作文件, 但保证在任一时刻都只有一个
线程执行SomeMethod成员函数。该函数首先将文件长度截为零, 然后将对象Serialize
到文件中。

BUG:
当Application运行中关闭Console窗体,文件的长度可能为零(有时正常,有时为零)。

尝试解决办法:
在函数中加入try, finally块,失败。
在函数中加入Thread.BeginCriticalRegion() & Thread.EndCriticalRegion() , 失败.

问题:
如果注释掉"stream.SetLength(0);"行,程序不会出现该BUG.
我的理解是,当线程运行到 serializer.Serialize 函数的时候刚好碰到我关闭Console窗口,
线程给强制退出,而stream还没来得及Write.

如果修改该Bug可以在SetLength(0)前做一个备份,但我期望能有更好的解决办法。


代码:

public static SomeMethod()
{
stream.SetLength(0);
...
serializer.Serialize(stream, src);
...
stream.Flush();
}
...全文
107 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shrinerain 2007-11-08
  • 打赏
  • 举报
回复
Sorry,
shoule be AutoResetEvent
shrinerain 2007-11-08
  • 打赏
  • 举报
回复
AutoRestEvent
zquboy 2007-11-08
  • 打赏
  • 举报
回复
补充:

用VS2005调试该Application时会出现该BUG.
但直接运行该程序集时没出现(至少几十次都没有发现)
zquboy 2007-11-08
  • 打赏
  • 举报
回复
回复 IThurricane :

该成员函数为static, lock(this) 无效。
IThurricane 2007-11-08
  • 打赏
  • 举报
回复
public static SomeMethod()
{
lock(this)
{
stream.SetLength(0);
...
serializer.Serialize(stream, src);
...
stream.Flush();
}
}
这样可以吗?
zquboy 2007-11-08
  • 打赏
  • 举报
回复
tt!
  • 打赏
  • 举报
回复
还有就是你在你的程序里实现这个方发protected void Finalize();加上你的处理,写到文件里去
IThurricane 2007-11-08
  • 打赏
  • 举报
回复
我的意思是你要控制线程的同步,
在关闭Console窗口前
先SomeMethodThread.Join一下试试呢
  • 打赏
  • 举报
回复
public static SomeMethod()
{
try
{
stream.SetLength(0);
...
serializer.Serialize(stream, src);
...
}
catch( Exception ex )
{
}
finally
{
stream.Flush();
}
}
这个每次都写到文件里的。可以不?
NewUser2008 2007-11-08
  • 打赏
  • 举报
回复
up

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧