我一直在搜索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)
性能方面,它似乎具有可比性,稍慢,但取决于你正在做什么它可能没问题,它肯定需要更少的代码.
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |