当前位置: 首页 > 编程语言 > C#

从工作线程更新表单控件的最佳方法是什么?从工作线程共享

时间:2023-04-10 13:19:05 C#

更新表单控件的最佳方法是什么?我做了一些研究,但我真的找不到从C#中的工作线程更新表单控件的首选方法。我知道BackgroundWorker组件,但不使用BackgroundWorker组件的最佳方法是什么?一般的经验法则是不要从UI线程本身以外的任何线程更新UI。使用BackgroundWorker的功能是个好主意,但您不希望在不同的线程上发生某些事情,您应该执行“Invoke”或BeginInvoke以强制委托在UI线程上执行该方法。编辑:JonB在评论中提出了这一点:记住Invoke()是同步的而BeginInvoke()是异步的。如果使用Invoke(),则必须注意不要造成死锁。除非您确实需要同步调用,否则我建议使用BeginInvoke()。一些简单的示例代码://更新文本框文本。privatevoidUpdateText(stringtext){//设置文本框文本。m_TextBox.Text=文本;}publicdelegatevoidUpdateTextCallback(stringtext);//然后从你的线程你可以调用这个...m_TextBox.Invoke(newUpdateTextCallback(this.UpdateText),newobject[]{"Textgeneratedonnon-UIthread."});上面的代码来自这里的常见问题解答和这里涉及的更长的代码。你为什么不想使用BackgroundWorker来做呢?它有一个很棒的回调事件,称为ProgressChanged,它允许UI线程知道更新,非常适合进度条更新等。链接到详细信息这里有一个关于这个的讨论。基本上,您使用Invoke来完成它。祝你好运!在调用Invoke时,我还会考虑InvokeRequired(仅限VS2008)。有时您不会从单独的线程更新UI。它节省了创建委托等的开销。C#学习教程就是这样:What'sthebestwaytoupdateformcontrolsfromaworkerthread?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——if(InvokeRequired){//This.Invoke是为了规避跨线程异常而添加的。this.Invoke(newUpdateProgressBarHandler(UpdateProgressBar),newobject[]{progressPercentage});}else{UpdateProgressBar(progressPercentage);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: