Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 使用async/wait,UI在设置内容后冻结_C#_Wpf_Asynchronous_User Controls_Async Await - Fatal编程技术网

C# 使用async/wait,UI在设置内容后冻结

C# 使用async/wait,UI在设置内容后冻结,c#,wpf,asynchronous,user-controls,async-await,C#,Wpf,Asynchronous,User Controls,Async Await,遇到了一些问题,无法理解出现问题的原因。 我使用的是.NET4.5/C,我尝试在异步函数成功后将内容设置为ContentControl。 我想在程序的这一部分中重点介绍的是在自己的WPF加载动画(Usercontrol IsLoading)和PDF内容(Usercontrol PDFDokument)之间切换。PDF是在“PDFDokument”中内部加载和呈现的,并且已经运行良好。 如果需要更多信息,欢迎每一个询问。 为了让你知道,我会说我仍然处于发展的初级阶段。(三年中的第一年:) publ

遇到了一些问题,无法理解出现问题的原因。 我使用的是.NET4.5/C,我尝试在异步函数成功后将内容设置为ContentControl。 我想在程序的这一部分中重点介绍的是在自己的WPF加载动画(Usercontrol IsLoading)和PDF内容(Usercontrol PDFDokument)之间切换。PDF是在“PDFDokument”中内部加载和呈现的,并且已经运行良好。 如果需要更多信息,欢迎每一个询问。 为了让你知道,我会说我仍然处于发展的初级阶段。(三年中的第一年:)

public ucPDFDocument PDFDokument=new ucPDFDocument();
公共ucLoading IsLoading=新ucLoading();
受保护的异步void lstSuchergebnis\u双击项(对象发送器,鼠标按钮ventargs e)
{
var tempAkte=((ListViewItem)sender)。内容为Akten;
tbctrlResultPanel.SelectedIndex=1;
PDFDokument.IsDataChangeAllowed(false);
contSwapControls.Content=正在加载;
等待PDF(坦帕克特);
contSwapControls.Content=PDFDokument;**{PDFDokument.LoadPDFDokument(_tempAkte.akt_ID,ref _DaKsManger);});
}
我尝试了使用异步加载的不同方法,但没有解决这个问题

希望有人知道如何解决这个问题:)


非常感谢

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

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

如果在调试器冻结时暂停调试器,您会看到什么调用堆栈?为了获得调用堆栈,我在foreach循环中插入了stacktrace&stackframe对象以使用stackframe.getmethod().name。如果我在循环之后暂停调试器,那么我会得到一长串调用堆栈,说MoveNext InvokeMoveNext RunInternal Run b_u3 InternalRealCall。。。。。。Main _nexecutateAssemblynexecutateAssembly Run ExecuteAAssembly CreateInstance CreateInstance RunUsersSemblydBuginZone ThreadStart_Context RunInternal Run Run ThreadStart“当我恢复程序时(或正常启动时),它会出现一个错误,说IOException“Control Access by the Other Thread as Build in”(就像@Xtudio在回答中说的,但今天是我第一次遇到异常)如果在调试器冻结时暂停调试器,会看到什么调用堆栈?为了获得调用堆栈,我插入了stacktrace&stackframe对象以使用stackframe.getmethod().name在foreach循环中。如果我在循环之后暂停调试器,则会得到该调用堆栈的一长列表,称为MoveNext InvokeMonext RunInternal Run Run b__3 InternalRealCall……Main _NexecuteAssemblyNexecuteAssembly Run ExecuteAssembly CreateInstance CreateInstance RunUsersSemblyDebuginZone ThreadStart\u上下文RunInternal Run ThreadStart“当我恢复程序(或正常情况下启动)时,它会通过一个错误退出,称为IOException“Control access by the other Thread as build in”(就像@Xtudio在回答中所说的,但今天是我第一次遇到该异常)嗯,好的,所以我需要改变我将内容设置为该控件的方式。昨天我想到了使用事件或类似的方式。我尝试了一些方法来解决这个问题。嗯,好的,所以我需要改变我将内容设置为该控件的方式。昨天我想到了使用事件或类似的方式。我尝试了一些方法来解决这个问题。
    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); });
    }