C#关于定时器和多线程中对控件的操作以及界面假死的现象。
我想在多线程中对控件进行定时操作,每隔几百毫秒对RichTextBox控件的内容进行添加更新,但是更新了2次,界面就假死了,想问问是怎么回事,相关代码如下:private...
我想在多线程中对控件进行定时操作,每隔几百毫秒对RichTextBox控件的内容进行添加更新,但是更新了2次,界面就假死了,想问问是怎么回事,相关代码如下:
private void Form1_Load(object sender, EventArgs e)
{
//省略其他无关代码
timer2.Interval = 700;
timer2.Enabled = false;
}
多线程相关代码:
new Thread((ThreadStart)(delegate
{
rtxtTestResults.Invoke((MethodInvoker)delegate
{
rtxtTestResults.Text = "正在导入中";
rtxtTestResults.SelectAll();
rtxtTestResults.SelectionColor = Color.Green;
});
this.Invoke((MethodInvoker)delegate
{
timer2.Enabled = true;
});
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [" + name + "$] where 测试日期 = #"+date+"#";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
dataGridView1.Invoke((MethodInvoker)delegate
{
dataGridView1.DataSource = ds.Tables[0];
});
}))
.Start();
字数限制,请指点 展开
private void Form1_Load(object sender, EventArgs e)
{
//省略其他无关代码
timer2.Interval = 700;
timer2.Enabled = false;
}
多线程相关代码:
new Thread((ThreadStart)(delegate
{
rtxtTestResults.Invoke((MethodInvoker)delegate
{
rtxtTestResults.Text = "正在导入中";
rtxtTestResults.SelectAll();
rtxtTestResults.SelectionColor = Color.Green;
});
this.Invoke((MethodInvoker)delegate
{
timer2.Enabled = true;
});
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [" + name + "$] where 测试日期 = #"+date+"#";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
dataGridView1.Invoke((MethodInvoker)delegate
{
dataGridView1.DataSource = ds.Tables[0];
});
}))
.Start();
字数限制,请指点 展开
3个回答
展开全部
不清楚具体原因,不过你这里面定时器没什么意义,直接用循环就行了,类似于下面的,timer2什么的代码可以删掉了,直接在formload的时候启动下面的线程
new Thread((ThreadStart)(delegate
{
while(true)
{
this.Invoke((MethodInvoker)delegate
{
rtxtTestResults.Text = "正在导入中";
rtxtTestResults.SelectAll();
rtxtTestResults.SelectionColor = Color.Green;
// timer2.Enabled = true;//这里为什么又来一次?
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [" + name + "$] where 测试日期 = #"+date+"#";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
dataGridView1.DataSource = ds.Tables[0];
});
Thread.Sleep(700);
}
}))
.Start();
追问
问题中的线程是在导入按钮的Click事件里面new的。formload里面我是把timer2置的false。
追答
那没什么区别,把你定时器里的代码移出来新建个线程,用类似上面的while(true)来刷新就可以了。
展开全部
new Thread((ThreadStart)(delegate
{
this.Invoke(()=>{
rtxtTestResults.Text = "正在导入中";
rtxtTestResults.SelectAll();
rtxtTestResults.SelectionColor = Color.Green;
timer2.Enabled = true;}
);
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [" + name + "$] where 测试日期 = #"+date+"#";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
this.Invoke(()=>{dataGridView1.DataSource = ds.Tables[0];});
})).Start();
错误应该是在 timer2_Tick 里, 简单的多线成用BackgroundWorker
BackgroundWorker 类 (System.ComponentModel)
https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在子线程里面加一句this.Update();试一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询