首页 > 其他分享 >async/await 致WPF卡死问题

async/await 致WPF卡死问题

时间:2023-09-23 22:01:16浏览次数:34  
标签:异步 Task 结果 await getResult async WPF

问题代码:

xmal:一个按钮+一个显示框

 

1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button>
2 <TextBox x:Name="display" Width="300" Height="300"></TextBox>

cs:点击按钮,显示结果

        async Task<int> getResult()
        {
            await Task.Delay(1000);
            return 10;            
        }

        private  void Button_Click(object sender, RoutedEventArgs e)
        {
            display.Text = "Starting to get Result..........\n";
            var t= getResult().Result;
            display.AppendText($"The result is:{t}\n");
        }

Button_Click事件处理中获取异步方法getResult的结果, getResult只是简单等待1s后返回结果,却并没有如预期返回。

分析:

getResult中遇到await后,主线程返回等待结果,await处异步线程执行完之后,后面的任务仍交由主线程去处理(返回结果),而主线程在等待结果,造成死循环。

解决办法:

  1. 主线程异步等待结果(click事件也要改写成async)
    var t=await getResult();
  2. await任务执行完之后仍交于当前线程处理后续步骤(返回结果)

    await Task.Delay(1000).ConfigureAwait(false)

     

翻译

搜索

复制

标签:异步,Task,结果,await,getResult,async,WPF
From: https://www.cnblogs.com/stephen2023/p/17725159.html

相关文章

  • async函数-await
    await必须用在被async修饰的函数内(因为await会阻塞代码,但是阻塞的范围要限制在async函数执行的范围内)箭头函数中,添加async函数要写在参数的前面await是在异步函数内部使用的关键字,用于等待一个Promise对象的解决(成功)或拒绝(失败)。当使用await关键字时,它会暂停函数......
  • WPF实现文档打印的功能
    先贴代码:privatevoidOnPrint(){vardialog=newPrintDialog();if(dialog.ShowDialog()!=true){return;}vardoc=_viewer.Document;doc.PageHeight=dialog.PrintableAreaHeight;doc.PageWidth=dialog.PrintableAreaW......
  • WPF 中使用 Pack URI
    在标记中使用PackURI在标记中,使用packURI设置某个属性的元素,从而指定packURI。例如:<elementattribute="pack://application:,,,/File.xaml"/>表1阐释了可以在标记中指定的各种绝对packURI。表1:标记中的绝对PackURI文件绝对packURI资源文件-本......
  • wpf viewmodel中控制页面焦点
    publicstaticclassFocusBehavior{privatestaticDictionary<UIElement,RoutedEventHandler>handlers=newDictionary<UIElement,RoutedEventHandler>();publicstaticbool?GetIsFocused(DependencyObjectobj){......
  • WPF异步命令以及SqlSugar异步增删改查
    1、异步///<summary>///查询全部///</summary>///<returns></returns>publicasyncTask<List<IgniteTubeInfo>>QueryListAsync(){returnawaitdb.Queryable<IgniteTubeInfo>().ToListAsync();}///<summa......
  • 解决WPF+Avalonia在openKylin系统下默认字体问题
    一、openKylin简介openKylin(开放麒麟)社区是在开源、自愿、平等和协作的基础上,由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区,致力于通过开源、开放的社区合作,构建桌面操作系统开源社区,推动Linux开源技术及其软硬件生态繁荣发......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控
    在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数据要重新录入的尴尬场景。本篇随......
  • 【WPF】PasswordBox汇总
    一、回车事件写法1:绑定:TextPassWord.KeyDown+=TextPassWord_KeyDown;privatevoidTextPassWord_KeyDown(objectsender,KeyEventArgse){if(e.Key==Key.Enter){TextErr.Text=null;......
  • wpf 覆盖元素在webview2之上
    元素代码来源githubCrissCross项目需要两个工具类及一个webview2的封装类//Copyright(c)ChrisPulman.Allrightsreserved.//LicensedundertheMITlicense.SeeLICENSEfileintheprojectrootforfulllicenseinformation.usingSystem;usingSystem.Runt......
  • [WPF]万物皆可绑定
    最近一个项目有一个需求,需要在ComboBox中选择时,获得SelecetedValue值并执行一个方法,查了一下可以用Interactivity进行触发器重写,用一个事件来绑定命令。但网上很多资料真的很坑,写了方法但是没提前提条件,需要在NuGet中安装一个Microsoft.Xaml.Behaviors.Wpf包来支持这个功能,然后在......