线程里访问数据库,丢数据,重复记录

tengxinhengye 2017-01-02 09:54:12
public void PrintSemiMLabel()
{
while (_isPrinting)
{
if (_printCount > 0)
{
try
{
object objTime = SqlHelper.ExecuteScalar("select getdate()");
if (objTime == null || objTime == DBNull.Value)
{
_isPrinting = false;
return;
}
DateTime time = Convert.ToDateTime(objTime);

//_printLabel.CreateDate = checkEdit1.Checked ? time : DateTime.Now;
//_printLabel.DOM = rgDOM.SelectedIndex == 0 ? time : deDOM.DateTime;

if (!SemiMSheetLabelHandler.Add(_printLabel))
{
_isPrinting = false;
return;
}

_labelPrint.PrintLabel();
}
catch (ArgumentException ex)
{
//XtraMessageBox.Show();
_isPrinting = false;
}

_printLabel.sheetNum++;
_printCount--;

if (_printCount == 0)
{
_isPrinting = false;
}
}
Thread.Sleep(_timeSpan * 1000);
}
}

这是个线程的方法,完成每隔_timeSpan * 1000时间保存并打印一次printLabel
正常情况下,保存和打印的流水号都是连续的,_printLabel.sheetNum++控制流水号
但是偶尔就会出现001,003,004的情形(数据库里没有002,也没有打印出002),暂叫跳打
也会出现001,001的情形,数据库里有两个001,打印也是两个001,重号

什么原因呢?这种现象不常见
...全文
157 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
加个锁试试呗
tengxinhengye 2017-01-03
  • 打赏
  • 举报
回复
引用 6 楼 Hello_Ge 的回复:
加个锁试试呗
嗯,但是不知道加在哪块合适
tengxinhengye 2017-01-03
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
如果多线程访问全局变量,读写都需要加锁 否则就会出“脏”数据
锁加载哪块比较好?
tengxinhengye 2017-01-03
  • 打赏
  • 举报
回复
引用 4 楼 msd88 的回复:
代码不完整,贴的有点乱,看起来眼疼。 单纯从你这段程序上来看应该不会出现这情况。_printLabel这个变量主线程或其它线程中还有使用吗?
不好意思,确实贴的有点乱 _printLabel变量在主线程中声明,并且只用过一次,是在取消打印按钮的事件里将_printLabe赋值为false
xian_wwq 2017-01-02
  • 打赏
  • 举报
回复
如果多线程访问全局变量,读写都需要加锁 否则就会出“脏”数据
msd88 2017-01-02
  • 打赏
  • 举报
回复
代码不完整,贴的有点乱,看起来眼疼。 单纯从你这段程序上来看应该不会出现这情况。_printLabel这个变量主线程或其它线程中还有使用吗?
tengxinhengye 2017-01-02
  • 打赏
  • 举报
回复
if (!SemiMSheetLabelHandler.Add(_printLabel)) { _isPrinting = false; return; } add方法调用了sqlhelper的静态方法ExcuteNonquery(),是不是这里的原因
tengxinhengye 2017-01-02
  • 打赏
  • 举报
回复
引用 1 楼 FoxDave 的回复:
线程没控制好呗
可能是哪行的问题?
Justin-Liu 2017-01-02
  • 打赏
  • 举报
回复
线程没控制好呗

110,502

社区成员

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

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

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