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();
字数限制,请指点
展开
 我来答
syht2000
高粉答主

2015-05-11 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部

不清楚具体原因,不过你这里面定时器没什么意义,直接用循环就行了,类似于下面的,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)来刷新就可以了。
lrh3321
2015-05-11 · TA获得超过2182个赞
知道大有可为答主
回答量:2296
采纳率:75%
帮助的人:2092万
展开全部
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

追问

这个是怎么回事呢:


字数限制,我的timer2_Tick的代码如图片所示:

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
husunli163
2015-05-11
知道答主
回答量:29
采纳率:0%
帮助的人:16.4万
展开全部
在子线程里面加一句this.Update();试一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式