我想知道是否有人遇到过这个问题。我试图在 WPF 应用程序的 RichTextBox 中显示所有日志记录事件,并认为我可以使用 UserControl 上的 IAppender 接口来添加全局 Appender。
我正在使用 BackgroundWorker 在后台运行“长时间运行”进程,并在 DoWork 事件期间创建 logger.Info("text") 事件。
我遇到的问题是 DoAppend 事件触发,并且似乎文本在 Dispatcher 事件期间得到更新,但 UI 没有反映这一点。
这是我的 LogAppender 类:
public partial class LogAppender : UserControl, IAppender
{
public LogAppender()
{
InitializeComponent();
}
public void Close()
{
}
public log4net.Layout.PatternLayout Layout
{
get;
set;
}
public void DoAppend(log4net.Core.LoggingEvent loggingEvent)
{
this.LogTextBlock.Dispatcher.Invoke(
DispatcherPriority.Normal,
new Action(
delegate
{
StringWriter writer = new StringWriter();
this.Layout.Format(writer, loggingEvent);
this.LogTextBlock.AppendText(writer.ToString());
}));
}
}
<UserControl>
<Grid>
<RichTextBox x:Name="LogTextBlock"/>
</Grid>
</UserControl>
这是我的 MainWindow.xaml 按钮单击和 backgroundworker 代码:
public partial class MainWindow
{
protected static readonly ILog logger = LogManager.GetLogger(typeof(MainWindow));
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
logger.Info("Complete");
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
logger.Info("Start");
Thread.Sleep(5000);
logger.Info("End");
}
}
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Height="30" Click="Button_Click_1">Start</Button>
<local:LogAppender Grid.Row="1" Grid.ColumnSpan="2"/>
</Grid>
我尝试将 TextBlock 绑定到由 DoAppend 方法生成的文本以及设置 TextBlock 的 Text 属性,但无济于事。
我确定我遗漏了一些小而重要的观点,但是今天下午我挠了挠头大约 3 个小时,但无济于事。
任何帮助表示赞赏!
谢谢布莱恩