我已经做了一些研究,并且我找不到从C#中的工作线程更新窗体控件的首选方法。我知道BackgroundWorker组件,但是如果不使用BackgroundWorker组件,最好的方法是什么?从工作线程更新表单控件的最佳方法是什么?
6
A
回答
10
有一个一般的经验法则,说不要从UI线程本身以外的任何线程更新UI。使用BackgroundWorker的功能是一个好主意,但您不希望在不同的线程上发生某些事情,您应该执行“Invoke”或BeginInvoke来强制委托在UI线程上执行该方法。
编辑:乔恩乙方在意见中提出这点好:
记住调用()是 同步而BeginInvoke()是 异步的。如果使用Invoke(),那么 必须小心,不要导致 死锁。我会推荐 BeginInvoke(),除非你真的需要 这个调用是同步的。
一些简单的示例代码:
// Updates the textbox text.
private void UpdateText(string text)
{
// Set the textbox text.
m_TextBox.Text = text;
}
public delegate void UpdateTextCallback(string text);
// Then from your thread you can call this...
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText),
new object[]{"Text generated on non-UI thread."});
5
为什么不使用BackgroundWorker来做它?它有一个梦幻般的回调事件,名为ProgressChanged,它让UI线程知道更新,完美适用于Progess条形更新等。
1
1
我还会在调用Invoke时考虑InvokeRequired(仅限于VS2008)。有时您不会从单独的线程更新UI。它节省了创建委托等的开销。
if (InvokeRequired)
{
//This.Invoke added to circumvent cross threading exceptions.
this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage });
}
else
{
UpdateProgressBar(progressPercentage);
}
相关问题
- 1. 什么是从SQL Server更新工作表的最快方法
- 2. JAVA:调度线程工作的最佳方式是什么?
- 3. 制作线程循环的最佳方法是什么?
- 4. 从另一个线程更新ObservableCollection的最佳方式是什么?
- 5. 更新gemspec文件列表的最佳做法是什么?
- 6. 什么是在线工作MVC项目的最佳方式?
- 7. 清除C#表单上所有控件的最佳方法是什么?
- 8. 从线程更新进度栏的最佳方法
- 9. 制作可变线程安全的最佳方式是什么?
- 10. 在Android中线程的最佳方法是什么?
- 11. 实现线程定时器的最佳方法是什么
- 12. 什么是WPF多线程的最佳方法
- 13. 撤消记录更新的最佳方法是什么?
- 14. 什么是我现场处理和更新的最佳方法?
- 15. 更新cookie的最佳方法是什么?
- 16. 什么是安全更新hibernate实体的最佳方法?
- 17. 更新角度应用程序的最佳方式是什么?
- 18. 什么是更新数据库列表的最佳方式?
- 19. 什么是更新SQL Server CE表的最佳方式?
- 20. 什么是使用jQuery查找ASP.Net控件的最佳方法?
- 21. 什么是在OnInit()中获取控件值的最佳方法?
- 22. 从控制器引用文件的最佳方式是什么?
- 23. 什么是创建多个后台工作线程的最佳方式?
- 24. 什么是更新TextMate软件包的最佳方式?
- 25. 什么是刷新JSF页面编程的最佳方法
- 26. 使用puppet更新WAR文件中的文件的最佳方法是什么?
- 27. 在SQLite表中更改键的最佳方法是什么?
- 28. 验证上传表单的最佳方法是什么?
- 29. 用jQuery填充表单的最佳方法是什么?
m_TextBox.Invoke究竟做了什么?它是否强制委托在UI线程上执行?确切地说, – Yttrium 2008-10-15 23:48:00