WinForms interthread修改

Eri*_*ric 2 .net c# c++ vb.net winforms

每当我想从另一个线程修改winform时,我需要使用

->Invoke(delegate, params)

以便修改发生在winform自己的线程中.

对于需要修改gui的每个函数,我需要另一个委托函数.

是否有一些方案允许我限制所需的委托功能的数量?我有一个控制器类,可以在一个地方处理整个gui,我考虑重用代表但是闻起来很糟糕.

我认为我的问题可以适用于winform可以运行的所有语言

Mic*_*ows 6

如果您使用的是C#3,则可以使用lambda,而在C#2中,则使用匿名委托.当不需要重用行为时,这些简化了语法.我经常做的一件事是在表单代码中进行同步,而不是在控制器中进行.控制器不应该受到这种技术更具体的"管道"问题的困扰,而不是控制器逻辑.

public void ResetFields()
{
    // use "delegate" instead of "() =>" if .Net version < 3.5
    InvokeOnFormThread(() => 
    {
        firstInput.Text = Defaults.FirstInput;
        secondInput.Text = Defaults.SecondInput;
        thirdChoice.SelectedIndex = Defaults.ThirdChoice;
    });
}

// change Action to MethodInvoker for .Net versions less than 3.5
private void InvokeOnFormThread(Action behavior) 
{
    if (IsHandleCreated && InvokeRequired)
    {
        Invoke(behavior);
    }
    else
    {
        behavior();
    }
}
Run Code Online (Sandbox Code Playgroud)

作为一种做法,使表单中的所有公共方法调用"InvokeOnFormThread".或者,您可以使用AOP拦截表单上的公共方法调用并调用"InvokeOnFormThread",但上面已经运行得很好(如果您保持一致并记住总是在窗体或UserControls上的公共方法上执行).