我正在制作一个C#异步套接字客户端。
客户端与Microsoft的链接示例几乎相同: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-client-socket-example
我还使用log4net进行以下配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline" />
</layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value=".\log\logfile.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="2MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
简而言之,上面的配置使日志转到指定的文件,并使用DoAppend将其显示到GUI。
然后,在Socket的Connect and Receive回调中。 我叫log.Info,log.Error等。
在DoAppend中:
this.sideLogText.Text += loggingEvent.Level.Name + ' ' + loggingEvent.MessageObject.ToString() + Environment.NewLine;
这将填充GUI文本框。 但是我得到一个错误,“调用线程无法访问该对象,因为另一个线程拥有它。”
所以,我用了这个:
this.Dispatcher.Invoke(
DispatcherPriority.Normal, (Action)(() =>
{
...write to GUI
}
));
没有错误,但是文本不在GUI上显示。 我很困惑。 我在这里想念什么吗?
答案 0 :(得分:0)
尝试将调度程序的优先级从“正常”更改为ContextIdle
Dispatcher.Invoke(新操作(()=> {}),DispatcherPriority.ContextIdle);