【发布时间】:2013-04-05 15:03:25
【问题描述】:
所以我有多线程我的应用程序。我遇到了这个错误“跨线程操作无效:控件从创建它的线程以外的线程访问。”
我的线程正在调用 Windows 窗体控件。所以为了解决这个问题,我使用了
Control.Invoke(new MethodInvoker(delegate { ControlsAction; }));
我正在尝试找出一种方法来制作这种通用方法,以便我可以重用代码并使应用程序更清洁。
例如,在我的调用中,我使用富文本框执行以下操作。
rtbOutput.Invoke(new MethodInvoker(delegate {
rtbOutput.AppendText(fields[0].TrimStart().TrimEnd().ToString() + " Profile not
removed. Check Logs.\n"); }));
另一个是组合框,我只是在其中设置文本。
cmbEmailProfile.Invoke(new MethodInvoker(delegate { EmailProfileNameToSetForUsers =
cmbEmailProfile.Text; }));
另一个例子是富文本框,我只是简单地清除它。
rtbOutput.Invoke(new MethodInvoker(delegate { rtbOutput.Clear(); }));
我将如何创建一个可以为我执行此操作的通用函数,我只需要通过我希望它执行的操作传入控件?
这是我们迄今为止提出的。
private void methodInvoker(Control sender, Action act)
{
sender.Invoke(new MethodInvoker(act));
}
所以问题类似于 appendtext,它似乎不喜欢。
【问题讨论】:
-
对委托使用 Action
而不是 /。