Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';等待&x27;使用log4net登录时不返回UI线程_C#_Wpf_Async Await_Log4net_Ui Thread - Fatal编程技术网

C# ';等待&x27;使用log4net登录时不返回UI线程

C# ';等待&x27;使用log4net登录时不返回UI线程,c#,wpf,async-await,log4net,ui-thread,C#,Wpf,Async Await,Log4net,Ui Thread,我有一个WPF MVVM应用程序。我想使用async和await使我的UI在加载和处理文件时具有响应性。当waited方法使用log4net日志记录时,我遇到一个异常“调用线程无法访问此对象,因为另一个线程拥有它” // The method returns 'void' because it is used by a DelegateCommand! private async void LoadAndProcessFileAsync() { this.MyBindingList.Cle

我有一个WPF MVVM应用程序。我想使用
async
await
使我的UI在加载和处理文件时具有响应性。当
wait
ed方法使用log4net日志记录时,我遇到一个异常“调用线程无法访问此对象,因为另一个线程拥有它”

// The method returns 'void' because it is used by a DelegateCommand!
private async void LoadAndProcessFileAsync()
{
   this.MyBindingList.Clear(); // Works fine
   var importer = await Task.Run(() => new Importer());
   this.MyBindingList.Clear(); // Exception
}
进口商所做的只是:

public class Importer
{
  private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

  public Importer()
  {
    log.Info("Test");
  }
}
如果我注释掉
log.Info…
和静态
ILog
-变量,一切正常。如果执行以下操作,也会出现问题:

private async void LoadAndProcessFileAsync()
{
   this.MyBindingList.Clear(); // Works fine
   var test = await Task.Run(() => Math.Sqrt(9));
   var importer = new Importer();
   this.MyBindingList.Clear(); // Exception
}
如果我在
async
方法中根本不使用
wait
,它就会消失


为什么会发生这种情况?如何使用
wait
和一起登录?(我使用的是使用log4net的第三方库,因此我无法更改该代码…。

您的异步方法示例都返回void,因此不会等待,为了等待任务,它必须至少返回任务,并且如果您拥有“调用线程无法访问此对象,因为其他线程拥有它”“问题请尝试使用调度程序:

Application.Current.Dispatcher.Invoke(() => {Your Action;} );

异步方法本质上是在一个新线程上运行的

如果您将日志设置为非静态,则可以很好地确保不会出现问题。静态日志意味着您在多个线程中使用同一对象;因此,为什么除了主线程(在初始化期间创建所有静态对象的线程)之外的线程在访问它时会出现问题。如果它是您不拥有的第三方库,您如何知道
Importer
会做什么呢?@Evk:I编写
Importer
来重现错误。第三方库是xBim(开源),我必须检查他们如何准确地处理他们的日志记录。为了澄清,这是复制问题的精确代码,而不是一些伪代码?那么值得发布能够复制这种行为的精确代码,而无需剥离任何内容(嗯,任何与复制相关的内容),因为对于当前代码,它是不可复制的。不等待
async void
-方法不是真的,它可以正常工作。但是,我尝试了你的建议,
应用程序。当前的
null
!这可能与我的设置有关,我通过C++/CLI包装器从Fortran调用C#。。。如果在一个简单的C#应用程序中出现错误,我必须尝试一下。异步方法本质上运行在一个新线程上也是不正确的。如果合适,任务调度器可以在调用线程上同步运行
async
方法。此外,还有一些IO绑定的任务根本不需要任何线程。