我正在编写一个 WinForm 组件,在其中启动一个任务来进行实际处理并捕获延续中的异常。从那里我想在 UI 元素上显示异常消息。
Task myTask = Task.Factory.StartNew (() => SomeMethod(someArgs));
myTask.ContinueWith (antecedant => uiTextBox.Text = antecedant.Exception.Message,
TaskContinuationOptions.OnlyOnFaulted);
现在,我收到跨线程异常,因为该任务正在尝试从显然非 UI 线程更新 UI 元素。
但是,Component 类中没有定义 Invoke 或 BeginInvoke。
如何从这里继续?
UPDATE
另外,请注意,Invoke/BeginInvoke/InvokeRequired 在我的 Component 派生类中不可用,因为 Component 不提供它们。
您只需向组件添加一个属性,允许客户端设置一个表单引用,您可以使用该引用来调用其 BeginInvoke() 方法。
这也可以自动完成,最好这样没人会忘记。它需要一些相当难以理解的设计时魔法。这不是我自己想出来的,我是从 ErrorProvider 组件中得到的。值得信赖的来源等等。将其粘贴到您的组件源代码中:
using System.Windows.Forms;
using System.ComponentModel.Design;
...
[Browsable(false)]
public Form ParentForm { get; set; }
public override ISite Site {
set {
// Runs at design time, ensures designer initializes ParentForm
base.Site = value;
if (value != null) {
IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (service != null) this.ParentForm = service.RootComponent as Form;
}
}
}
当用户将组件放在窗体上时,设计器会自动设置 ParentForm 属性。使用 ParentForm.BeginInvoke()。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)