Я делаю 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.Я не совсем понимаю.Я что-то здесь упускаю?