所以我有多线程我的应用程序。我遇到了这个错误“跨线程操作无效:控制从一个线程以外的线程访问。”
我的主题是调用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,它似乎不喜欢。
答案 0 :(得分:3)
这样的事情可以解决问题:
public static class FormsExt
{
public static void InvokeOnMainThread(this System.Windows.Forms.Control control, Action act)
{
control.Invoke(new MethodInvoker(act), null);
}
}
然后使用它就像:
var lbl = new System.Windows.Forms.Label();
lbl.InvokeOnMainThread(() =>
{
// Code to run on main thread here
});
使用原始标签:
rtbOutput.InvokeOnMainThread(() =>
{
// Code to run on main thread here
rtbOutput.AppendText(fields[0].TrimStart().TrimEnd().ToString() + " Profile not removed. Check Logs.\n"); }));
});