跨线程调用问题 1、this.InvokeRequired,说白了就是判断当前线程是否为UI线程,如果不是UI线程(this.InvokeRequired = true),需要通过this.Invoke去调用窗体控件(给listbox1添加Item),否则可以直接操作窗体控件。2、打断点,单步调试有什么问题吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你这句话不就是控制线程安全吗,listBox1.Items.Add("the count is:" + paramString);这句话只有ui线程才能调用的 DoGUIUpdate这个函数,不就是个递归调用吗第一次调用,是在线程中,然后判断非UI线程,于是用委托再次执行自身再次执行时,是在UI线程里调用,于是进入else你说无法加断点,你把断点加到哪里了? 我怎么赶脚你的代码有点混乱呢,如果你想用backgroundworkder的话,可以直接完全按照backgroundworker的方法来做,这个是支持控件操作的,直接拖拽即可至于更新listview,你可以在do_work里边执行完了以后,用传递参数的办法传递到相应的 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)来操作UI线程和backgroundworder线程一般不建议直接进行数据交互,最好做一个托管,例如 backgroundWorker1_ProgressChanged private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) { //具体操作 webBrowser1.Navigate("http://www.baidu.com"); backgroundWorker2.ReportProgress(0,string.Format("{0}","可以是listview需要操作的地方")); } private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e) { //线程交互,可以对UI进行处理,数据来自e.userstata as object (你想转换的数据类型) string s = e.UserState.ToString(); } private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //线程执行完成后的操作 } backgroundWorker本身是为了简化跨线程处理用了backgroundWorker就可以不用委托否则直接起线程,使用委托,抛开backgroundWorker 求B/S和C/S架构通用的Session机制 怎么能保证窗口最大化的时候宽不变? 请各位好心人帮帮忙,遇到分页修改单条数据有误 写一个贪吃蛇遇到的问题 !!!! 谁能上给些C#实例? 谁做过虚拟机,就是简单的虚拟机 关于GridView的问题 请求帮忙 请问怎样得到当前时间问题,格式如20051013203012? 帮忙了,谢谢@ XML反序列化对象数组的问题 关于Backgroundworker的一个奇怪问题 使用DataRow 类绘图问题
第一次调用,是在线程中,然后判断非UI线程,于是用委托再次执行自身
再次执行时,是在UI线程里调用,于是进入else你说无法加断点,你把断点加到哪里了?
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)来操作UI线程和backgroundworder线程一般不建议直接进行数据交互,最好做一个托管,例如 backgroundWorker1_ProgressChanged
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
//具体操作
webBrowser1.Navigate("http://www.baidu.com");
backgroundWorker2.ReportProgress(0,string.Format("{0}","可以是listview需要操作的地方"));
} private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//线程交互,可以对UI进行处理,数据来自e.userstata as object (你想转换的数据类型)
string s = e.UserState.ToString();
} private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//线程执行完成后的操作
}
用了backgroundWorker就可以不用委托
否则直接起线程,使用委托,抛开backgroundWorker