log4net с клиентом сокетов AsyncCallback C # - PullRequest
0 голосов
/ 29 сентября 2018

Я делаю Async Socket Client из C #.

Клиент почти такой же, как пример ссылки от Microsoft: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-client-socket-example

Я также использую log4net для регистрации, с этимconfig:

<?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.

Затем в обратном вызове Connect и Receive от Socket.Я назвал 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 голосов
/ 29 сентября 2018

попробуйте изменить приоритет диспетчера с Normal на ContextIdle

Dispatcher.Invoke (new Action (() => {}), DispatcherPriority.ContextIdle);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...