我的程序是这样的,在我点击界面上按钮后,执行如下的异步委托:
this.BeginInvoke(new go(toF));
其中“toF”的方法中有操作UI控件的。所以用this.BeginInvoke来执行。但遇到问题是,我用UI的线程来执行toF,那么UI会卡死。但如果不用this.BeginInvoke来执行,那么又不可以跨线程安全操作UI控件。问题1是:我已经用异步BeginInvoke了而不是用Invoke同步,为什么UI还会卡死?异步也阻塞吗?问题2:.NET工具栏的自身的控件是怎么做到不卡死UI界面的?比如listBox这控件,在listBox.Items.Add()的时候界面也是很顺畅的???
this.BeginInvoke(new go(toF));
其中“toF”的方法中有操作UI控件的。所以用this.BeginInvoke来执行。但遇到问题是,我用UI的线程来执行toF,那么UI会卡死。但如果不用this.BeginInvoke来执行,那么又不可以跨线程安全操作UI控件。问题1是:我已经用异步BeginInvoke了而不是用Invoke同步,为什么UI还会卡死?异步也阻塞吗?问题2:.NET工具栏的自身的控件是怎么做到不卡死UI界面的?比如listBox这控件,在listBox.Items.Add()的时候界面也是很顺畅的???
using System.Timers;
public delegate void AddCheck(string val);//委托
public int flag = 0;
void ExecuteWork(object sender, ElapsedEventArgs e)
{
flag++;
this.BeginInvoke(new AddCheck(AddCheckHandler), new object[] { flag.ToString() });
}
void AddCheckHandler(string val)
{
checkedListBox1.Items.Add(val);
} System.Timers.Timer tm = new System.Timers.Timer(2000);
tm.Elapsed += new System.Timers.ElapsedEventHandler(ExecuteWork);
tm.AutoReset = true;
tm.Enabled = true;
以上 代码 没有任何卡的效果啊
(2)Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。
2.BeginInvoke和Invoke跟阻不阻塞UI线程没关系,是相对于子线程的,前者不阻塞子线程,后者阻塞子线程(这里的子线程是指调用this.Invoke和this.BeginInvoke的线程)
3.如果你大量操作UI界面,BeginInvoke和Invoke也解决不了界面卡的问题,它两只能解决跨线程访问控件的问题。BeginInvoke和Invoke跟界面卡不卡没有任何关系,这儿的异步是针对子线程而言的。参见 http://bbs.csdn.net/topics/390528065 #8
2.一定要把运算时间长的代码放在工作线程中而非UI线程。
原来是一开始我对异步和UI线程之间的理解错误,也谢谢楼上各位!