你的多线程没有起到作用,耗时的操作仍Sleep函数然是在UI线程中执行的,因此会导致UI冻结。(通过Debug看看执行Sleep函数时的调用栈就知道了)
把Do函数改成如下形式,让耗时操作在你新启动的线程中执行,UI线程中只负责更改界面(即执行和control相关的操作)。
private void Do() { Thread.Sleep(5000); List<string> list = new List<string>() { "c#" }; this.Invoke(new Action(() => { this.dataGridView1.DataSource = list; })); }
我这里用sleep函数只是为了模拟长时间操作........
this.Invoke(new Action(() =>
{
Thread.Sleep(5000);
List<string> list = new List<string>() { "c#" };
this.dataGridView1.DataSource = list;
}));
难道这段代码不是在新启动的线程中执行的吗??
那句通过Debug看看执行Sleep函数时的调用栈就知道了。。。怎么看。可否切个图说明下。分全给了。
this.Invoke(new Action(() =>
{
Application.DoEvents();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Thread.Sleep(5000);
List<string> list = new List<string>() { "c#" };
this.dataGridView1.DataSource = list;
}));
添加一行代码。
我不是使用了多线程吗。。相当于异步了。。为什么还会出现这种情况呢??请指教
没有看出来哪里使用了多线程,this.Invoke都是在界面线程中运行的。
这还不是多线程呀?
tr = new Thread(new ThreadStart(Do)); !!!!!!!!不懂就别回答
this.Invoke都是在界面线程中运行的。这句话怎么解释??