c#winform多线程,lock的问题,用了lock还是提示出错,报错为对象当前正在其他地方使用。

Farewellly 2016-04-11 10:12:03
求大神,我一头雾水的搞了半天还是报错,我用一个线程实时显示数据库数据的条数,并调用caption属性实时显示出来,结果在数据改变的时候,鼠标不停的点别的button时会报错。button click事件也是一个数据库查询到gridview事件。代码如下:

public void Thread2()
{
while (true)
{
Thread.Sleep(5000);

int box01 = rowcount("select * from smartbox01");
int inbox01 = box01 - rowcount("select * from smartbox01 where inuse ='借出'");
lock(this) calendarItem.Caption = string.Format("一号工具箱({0}/{1})", inbox01, box01);
// Thread.Sleep(20);
int box02 = rowcount("select * from smartbox02");
int inbox02 = box02 - rowcount("select * from smartbox02 where inuse ='借出'");
lock(this) tasksItem.Caption = string.Format("二号工具箱({0}/{1})", inbox02, box02);
}
}

private void calendarItem_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
{
gridView1.Columns.Clear();
this.xtraTabControl1.SelectedTabPage = xtraTabPage3;
string sql = string.Format("select INUSE as 使用状态,MODEL as 名称,SIZE as 规格,STATE as 工具状态,LOCATION as 地点,DATE as 时间,keyrfid.[USER]as 使用人员 from smartbox01 left join keyrfid on keyrfid.KEYRFID=smartbox01.KEYRFID");
using (SqlConnection conn = new SqlConnection(DBHelper.connstring))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
da.Fill(ds);
gridControl.DataSource = ds.Tables[0];
gridView1.Columns[5].DisplayFormat.FormatString = "yyyy-MM-dd HH:mm:ss";
}
}
...全文
583 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Farewellly 2016-04-13
  • 打赏
  • 举报
回复
@shingoscar 对啊,就不是我写的,是代码自动生成的,我也搞不清楚是哪里的什么东西被重复调用了,所以用个lock(this), 不过然并软 ╮(╯-╰)╭
Farewellly 2016-04-13
  • 打赏
  • 举报
回复
@dongxini 那我应该用什么方法比较合适呢?不是button的click事件,是baritem的linkclicked事件,不过也差不多了,我有很多这样类似的baritem事件,求一个比较好的处理方法,还有,我那个thread里换了try,catch写法,但似乎也没用
Farewellly 2016-04-11
  • 打赏
  • 举报
回复
不知道啊,不知道是什么地方在用,会不会是调用数据库的时候用了? lock(this)我知道 不行,可就是这样写也没有用。
枫0子K 2016-04-11
  • 打赏
  • 举报
回复
我要是告诉你最好不能用lock(this)这种写法你可赞成? lock本来就是给特定资源标记锁,试试改成lock一个字符串变量。
Poopaye 2016-04-11
  • 打赏
  • 举报
回复
哪个对象正在其他地方使用?
Farewellly 2016-04-11
  • 打赏
  • 举报
回复
在线等大神回答,分少,莫怪
  • 打赏
  • 举报
回复
不要用while(true) + sleep,而且中间一出错,你那线程就终止了
  • 打赏
  • 举报
回复
鼠标不停的点别的button报错? 你的button事件呢?calendarItem这个?
Poopaye 2016-04-11
  • 打赏
  • 举报
回复
引用 5 楼 farewellly 的回复:
base.Dispose(disposing); 这一句好像重复调用
上面的代码哪来的Dispose
疯子de幸福 2016-04-11
  • 打赏
  • 举报
回复
lock(this)惹的祸
Farewellly 2016-04-11
  • 打赏
  • 举报
回复
base.Dispose(disposing); 这一句好像重复调用

110,534

社区成员

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

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

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