在Control.Invoke期间需要设置多个属性

Ste*_*ten 1 c# invoke

我一直在搜索stackoverflow,以便将数据从一个线程编组回到UI线程,并在3.5中找到了各种方法.

对我来说更优雅的解决方案之一; 虽然我还在学习lambdas和闭包,但这个解决方案Control.Invoke带有输入参数.

我不完全理解代码,但我确实理解如何使用它,它并没有完全解决我的问题.

我想调用invoke并将字符串传递给另一个方法(DisplayStatusUpdate(msg)).任何指针将不胜感激.

    private void FireEventAppender_OnMessageLogged(object sender, MessageLoggedEventArgs e)
    {
        DisplayStatusUpdate(e.LoggingEvent.RenderedMessage);
    }

    private void DisplayStatusUpdate(string text)
    {
         _StatusTextBox.Text = _StatusTextBox.Text + text;
         _StatusTextBox.Text = String.Format("{0}\r\n", _StatusTextBox.Text);
         _StatusTextBox.SelectionStart = _StatusTextBox.Text.Length - 1;
         _StatusTextBox.ScrollToCaret();
    }
Run Code Online (Sandbox Code Playgroud)

Bra*_*on 5

您可以使用任意数量的参数执行此操作,例如:

private void FireEventAppender_OnMessageLogged(object sender, MessageLoggedEventArgs e)
{
    DisplayStatusUpdate(e.LoggingEvent.RenderedMessage);
}

private delegate void DisplayStatusUpdateDelegate(string text);

private void DisplayStatusUpdate(string text)
{
     if(InvokeRequired)
         this.Invoke(new DisplayStatusUpdateDelegate(DisplayStatusUpdate), text);
     else
     {
         _StatusTextBox.Text = _StatusTextBox.Text + text;
         _StatusTextBox.Text = String.Format("{0}\r\n", _StatusTextBox.Text);
         _StatusTextBox.SelectionStart = _StatusTextBox.Text.Length - 1;
         _StatusTextBox.ScrollToCaret();
     }
}
Run Code Online (Sandbox Code Playgroud)

我在当前项目中使用的另一种方法可以显着减少代码.细节在这里.

如果实现此方法,则需要:

使用AOP工厂创建表单:

Form f = AOPFactory.Create<Form1>();
Application.Run(f);
Run Code Online (Sandbox Code Playgroud)

然后,您只需使用[RunInUIThread]属性修饰事件处理程序.如果需要,它使用Castle的方法拦截模型自动调用.

因此,上面的代码变成:

private void FireEventAppender_OnMessageLogged(object sender, MessageLoggedEventArgs e)
{
    _StatusTextBox.Text = _StatusTextBox.Text + text;
    _StatusTextBox.Text = String.Format("{0}\r\n", _StatusTextBox.Text);
    _StatusTextBox.SelectionStart = _StatusTextBox.Text.Length - 1;
    _StatusTextBox.ScrollToCaret();
}
Run Code Online (Sandbox Code Playgroud)

性能方面,它似乎具有可比性,稍慢,但取决于你正在做什么它可能没问题,它肯定需要更少的代码.