使用AsyncCallback C#套接字客户端的log4net

时间:2018-09-29 11:54:49

标签: c# sockets asynchronous log4net

我正在制作一个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上显示。 我很困惑。 我在这里想念什么吗?

1 个答案:

答案 0 :(得分:0)

尝试将调度程序的优先级从“正常”更改为ContextIdle

Dispatcher.Invoke(新操作(()=> {}),DispatcherPriority.ContextIdle);

https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcherpriority?redirectedfrom=MSDN&view=netframework-4.7.2