创建一个MethodInvoker函数

时间:2013-04-05 15:03:25

标签: c# methods delegates

所以我有多线程我的应用程序。我遇到了这个错误“跨线程操作无效:控制从一个线程以外的线程访问。”

我的主题是调用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,它似乎不喜欢。

1 个答案:

答案 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"); }));
            });