2012-12-13 36 views
1

有一些问题,并不能得出它为什么出现。 我正在使用.net 4.5/C#,并尝试在异步函数成功后将Content设置为ContentControl。 我想要在程序的那部分中的主要焦点是在自己的WPF加载动画(Usercontrol IsLoading)和PDF内容(Usercontrol PDFDokument)之间切换。 PDF是内部加载&在“PDFDokument”内部呈现并且已经很好地工作。 如果需要更多信息,欢迎提问。 因为你知道我会说我仍处于开发的初级阶段。 (三年:)第一个))使用异步/等待,UI设置内容后冻结

public ucPDFDocument PDFDokument = new ucPDFDocument(); 
    public ucLoading IsLoading = new ucLoading(); 

    protected async void lstSuchergebnis_DoubleClickItem(object sender, MouseButtonEventArgs e) 
    { 
     var tempAkte = ((ListViewItem)sender).Content as Akten; 

     tbctrlResultPanel.SelectedIndex = 1; 
     PDFDokument.IsDataChangeAllowed(false); 
     contSwapControls.Content = IsLoading; 

     await PDF(tempAkte); 
     contSwapControls.Content = PDFDokument; **<-- after executing this line, the ui freezes** 
    } 

    private Task PDF(Akten paramAkte) 
    { 
     Akten _tempAkte = paramAkte; 
     return Task.Run(() => { PDFDokument.LoadPDFDokument(_tempAkte.akt_ID, ref _DaKsManger); }); 
    } 

我试过不同的方式使用异步加载,但没有解决这个问题。

希望有人知道如何解决:)

非常感谢!

+0

如果在调试器冻结时暂停调试器,您会看到什么调用堆栈? – SLaks

+0

为了获得调用堆栈,我插入了一个stacktrace&stackframe对象以在foreach循环中使用stackframe.getmethod()。name。如果我暂停调试器完全循环再后,我拿到调用堆栈的一个长长的清单,说 MoveNext的 InvokeMoveNext RunInternal 运行 运行 <.cctor> b__3 InternalRealCall ...... 主要 _nExecuteAssembly nExecuteAssembly 运行 ExecuteAsAssembly 的CreateInstance 的CreateInstance 的CreateInstance RunUsersAssemblyDebugInZone ThreadStart_Context RunInternal 运行 运行 ThreadStart“ – Daniel

+0

当我恢复程序(或正常启动)时,由于IOException异常”由另一个线程控制Acess,因为它是内置的“而退出(就像@Xtudio在他的答案中所述,但今天是我第一次得到这个例外) – Daniel

回答

1

唯一的异步是PDF(...),您等待。设置内容不是以异步方式执行。您正在设置的内容发生在UI线程上。 (这是唯一的方法,因为您正在修改UI,而UI只能在它创建的线程上发生)

+0

嗯好吧,所以我需要改变我设置内容的方式。昨天我有了一个关于使用事件或其他事情的想法。我尝试了一些方法来解决这个问题。 – Daniel