WPF 异步任务 阻塞 UI

2024-01-07

我已经与Task类型。一切都很好Task什么也不返回。例如:

XAML:

<Button Name="_button"
        Click="ButtonBase_OnClick">
        Click
</Button>  

隐藏代码:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    _button.IsEnabled = false;

    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(5*1000);
        Dispatcher.Invoke(new Action(() => _button.IsEnabled = true));
    });
}

这很好用。但是我要Task返回一些值,例如Boolean。所以我需要使用Task<Boolean>:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    _button.IsEnabled = false;

    var task = Task<Boolean>.Factory.StartNew(() =>
    {
        Thread.Sleep(5*1000);
        return true;
    });

    if (task.Result)
        _button.IsEnabled = true;
}

这里我们遇到了 UI 阻塞的问题。 UI 线程被锁定,直到任务返回结果。

_button.IsEnabled = false;

因此,上面的字符串被完全忽略。 我在.Net 4.0,所以我不能使用async/await方法。 这个问题真让我恶心……有解决了吗?


您的主线程正在阻塞,因为调用Task.Result等到Task已完成。相反,你可以使用Task.ContinueWith()访问Task.Result after the Task已完成。致电给TaskScheduler.FromCurrentSynchronizationContext()导致继续在主 UI 线程上运行(因此您可以访问_button安全)。

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    _button.IsEnabled = false;

    Task<Boolean>.Factory.StartNew(() =>
    {
        Thread.Sleep(5*1000);
        return true;
    }).ContinueWith(t=>
    {
        if (t.Result)
            _button.IsEnabled = true;
    }, TaskScheduler.FromCurrentSynchronizationContext());        
}

Update

如果您使用 C# 5,则可以使用 async/await 代替。

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    _button.IsEnabled = false;

    var result = await Task.Run(() =>
    {
        Thread.Sleep(5*1000);
        return true;
    });

    _button.IsEnabled = result;      
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 异步任务 阻塞 UI 的相关文章

  • 在 Datagrid wpf 上对数据进行分组

    我想使用包含组名称并包含所有 ClassMate 名称的扩展器重新组合我的数据 这是我的班级组 public class Group public List
  • 新的 Windows 应用程序 - 什么语言?

    我们目前正处于开发 Windows 桌面应用程序的前期阶段 但当听到有关 Windows 8 Silverlight WPF Jupiter 的所有最新讨论时 我不知道该相信什么了 现在用WPF启动一个新项目是不是有问题 我应该切换到 Si
  • Tabcontrol 中的 SelectedIndex 不变 - 调度程序问题

    为什么在我设置 SelectedIndex 0 后 我随后 而不是响应 得到使用 SelectedIndex 4 调用的事件处理程序 我追踪到对调度程序的调用 但我不明白为什么 计划如下 我有一个页面 其中包含带有各种选项卡的选项卡控件 当
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • 使用 Visual Studio 2012 在 wpf 工具包中找不到 AutoCompleteBox

    这确实是一个想要的功能 AutoCompleteBox 显然不是 AutoCompleteComboBox 但是 Visual Studio 2012 找不到 AutoCompleteBox 控件 但我没有在早期版本的vs中尝试过 所以这可
  • 禁止/阻止选择 wpf 中禁用的组合框项目

    我正在编写一个应用程序 其中我想禁用其中的一些项目ComboBox并且还想禁止 阻止选择禁用的项目 请注意ComboBox在主窗口中有另一个 ComboBox 作为 ComboBox Item init 在运行时由DataTemplateS
  • WPF鼠标按下事件没有坐标

    我在控件上使用 WPF 鼠标按下事件 我想获取 X Y 坐标 但出现错误 private void button MouseDown object sender MouseButtonEventArgs e double x e X dou
  • MVVM 中动态创建 MenuItem-Separator 的 WPF 光学样式

    我有一个MenuItem从动态创建其子菜单项ItemsSource 财产 对于分组 我在菜单中有分隔符 分隔符是由 ItemsSource 集合中的 ControlTemplate 为每个空条目创建的MenuItem ItemContain
  • 如何访问另一个类的字段

    您好 我有一个带有 2 个窗口的 WPF C 应用程序 我正在尝试访问 public int myInt 在我的主窗口中从我的其他窗口 MainWindow myInt 3 智能感知甚至不允许我访问该变量 有人可以帮忙吗 您需要将其声明为s
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • WPF ComboBox 中具有本地化名称的枚举

    我有一个列出枚举的组合框 enum StatusEnum Open 1 Closed 2 InProgress 3
  • WPF MVVM 在窗口关闭时调用 ViewModel Save 方法

    我已经弄清楚如何从我的 ViewModel 关闭窗口 现在我需要从另一侧解决窗口关闭问题 当用户单击窗口的关闭按钮时 我需要在 ViewModel 中触发 Save 方法 我正在考虑将 Command 属性绑定到 Window 的关闭事件
  • WPF 应用程序在第一次交互(例如单击按钮)后停止/冻结

    我目前在 WPF 中遇到问题 UI 加载正常 但每当进行第一次用户交互时 例如单击按钮 应用程序似乎会停止 或者例如 如果我有两个显示 MessageBox 的按钮 则第一次单击将等待几秒钟 然后显示MessageBox 但任何后续交互都是
  • 如何在鼠标悬停时突出显示 MahApps.Metro 的图块?

    我刚刚发现了一个非常出色的 WPF UI 工具包 MahApps Metro 我创建了一个带有 MahApps Metro Controls Tile 类型的图块的窗口 当鼠标经过时 我无法找到突出显示图块的正确方法 你知道我该怎么做吗 我
  • 设置 LinearLayout 的最大宽度

    如何设置水平线的最大宽度LinearLayout 因此 如果内容较短 例如某些文本 布局会缩小 如果内容较长 则布局不会扩展超过某个最大宽度值 我更喜欢在 XML 级别执行此操作 这就是我所需要的超出了之前答案中的建议 https stac
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • OxyPlot 中日期时间轴上的不规则间隔

    我有一个 WPF 应用程序 其中使用 OxyPlot 来绘制图表 我不断地将点添加到图表中的线系列中 X 轴是日期时间轴 其间隔类型设置为秒 点不断添加到线系列中 当第一个点和最后一个点之间的时间跨度是特定的秒数时 我删除第一个点并使绘图无
  • 如何覆盖运行时创建的 wpf 控件中的应用程序样式

    我试图在运行时创建一个 WPF 控件 但我不知道如何让它忽略来自 App xml 资源的样式 我尝试将样式设置为 null 并将 OverridesDefaultStyle 设置为 true 但没有成功 应用程序设置将前景设置为白色 我似乎
  • 如何将图像放在 UIButton 中文本的右侧?

    如果可以避免的话 我不想使用子视图 我想要一个UIButton其中包含背景图像 文本和图像 现在 当我这样做时 图像位于文本的左侧 背景图像 文本和图像都有不同的高亮状态 最简单的解决方案 iOS 10 及更高版本 Swift button

随机推荐

  • 将 cuBLAS 与 Thrust 的复数结合使用

    在我的代码中 我使用推力库中的复数数组 我想使用 cublasZgeam 来转置数组 使用 cuComplex h 中的复数并不是一个更好的选择 因为我对数组进行了大量算术运算 并且 cuComplex 没有定义的运算符 例如 这就是我定义
  • Android代码不扫描BLE设备CC2650

    我正在使用 CC2650STK SensorTag 我从 GitHub 下载了这个开源应用程序 https github com googlesamples android BluetoothLeGatt https github com
  • 如何正确调整 Facebook Canvas 应用程序 (iFrame) 的大小?

    我需要在更新页面内容后调整画布大小 我可以明确地做到这一点 FB Canvas setSize width 760 height 1480 但是 如果没有参数 它就无法工作 即 setSize 另外 我可以通过以下方式调整高度 FB Can
  • 保留 IBOutlet 视图元素真的是最佳实践吗?

    我不断遇到 UIViewControllers 包含大量 IBOutlet 将控制器连接到其视图的子视图 通常是 UILabels 的情况 遵循 最佳实践 即在所有 UI 元素上使用保留 property retain nonatomic
  • SQL 中的大文本和图像

    在 SQL 数据库中存储大量文本 例如 html 页面 是个好主意吗 或者将其作为 html 文件存储在文件系统中是一个更好的主意吗 图像也是如此 将图像数据存储在数据库中是一个好主意还是将它们放在磁盘上更好 例如 存储大量数据是否会导致性
  • 应用程序更新后推送通知令牌是否会更改?

    我问的是两种情况 1 我们从 App Store 进行定期更新后 2 在我们模拟更新后 通过从商店下载当前版本并从 Xcode 中安装和运行新版本 推送通知令牌会改变吗 如果改变 多久改变一次 例如 每次 还是时不时 我问这个 因为我正在做
  • 运行 pod install 时出现“您的项目未明确指定 CocoaPods 主规范存储库”警告

    我跑完之后pod install 我收到一条警告 您的项目没有明确指定 CocoaPods 主规范存储库 由于 CDN 现在被用作默认值 您可以通过以下方式安全地将其从存储库目录中删除 pod repo remove master 要抑制此
  • 为什么 Passport 不能与 cookieSession() 一起使用?

    我正在研究 facebook 授权 发现护照不能与 cookieSession 一起使用 只能与 session 一起使用 在第一种情况下 req user 始终未定义 有可能让它发挥作用吗 您仍然可以使用最新版本的 Express 重现此
  • NPOI - 写入文件会损坏 .xlsx 工作簿

    我有一段代码当前正在写入 xls工作簿 HSSFWorkbook 没有问题 但是 当我尝试使用相同的代码写入 xlsx工作簿 XSSFWorkbook 存档已损坏并且无法在 Excel 中打开 以下代码是我用来访问工作簿 编辑工作簿 然后保
  • 如何禁用下拉元素中的特定项目

    如何使用 jQuery 或 JavaScript 禁用下拉元素的某些项目 与禁用任何其他 HTML 元素相同的方式 使用 option selector prop disabled true 看到它在action http jsfiddle
  • Libgdx box2D 中的碰撞对于某些物体失败

    我正在使用 libgdx 和 box2d 开发我的第一个游戏 我正在使用调试渲染器来测试我的对象 我创建了一些类似汽车的物体 每辆车都有一个主体 它是一个6点的大多边形 长约1米 高0 7米 并有2个通过旋转关节连接的车轮 主车还通过旋转接
  • GDI+ LockBits()/UnLockBits() 异常

    我的程序是用 C 编写的 并在低级别上使用位图进行操作 一切工作正常 但有时 非常罕见 但稳定 会发生异常 通用 GDI 异常 并且很难重现这种情况 函数 LockBits 和 UnLockBits 发生异常 它包含错误代码 2147467
  • 如何在 QML 中捕获信号?

    如何将信号从一个 qml 组件发送到另一个 下面是一个例子 Rectangle id main width 360 height 360 signal clicked Text id testStr anchors centerIn par
  • Ingress 不转发请求 - 适用于 Windows 和 kubernetes 的 Docker 桌面

    EDIT 我删除了 minikube 在 Windows 的 Docker 桌面中启用了 kubernetes 并安装ingress nginx手动 helm upgrade install ingress nginx ingress ng
  • 使用powershell和svn删除未版本控制的文件

    我正在尝试编写一个构建脚本来使用 Powershell 签出代码 我需要能够使用 SVN 存储库中的适当更改来替换对工作副本所做的任何修改 这还包括删除在存储库中删除但未在工作副本中删除的所有文件 不幸的是 我无法进行干净的签出 因为每次运
  • Xdebug 3 docker mac PhpStorm 损坏的管道

    I see There was a problem sending 179 bytes on socket 11 Broken pipe 在 xdebug log 中看不到原因 这几天一直在兜圈子 尝试各种东西 我究竟做错了什么 X调试3
  • HTML 中的绝对路径不起作用

    我正在尝试使用小型 JavaScript 代码构建 HTML 模板 这是内容 在根目录下 我构建了两个文件 索引 html
  • 检查密码强度的最佳方法是什么?

    确保用户提供的密码是注册或更改密码表单中的强密码的最佳方法是什么 我的一个想法 用Python def validate password passwd conditions met 0 conditions total 3 if len
  • PK在深色模式和浅色模式下绘制不同的结果

    使用时PKDrawing在暗模式下生成的图像图像来自矩形 比例 https developer apple com documentation pencilkit pkdrawing 3237277 imagefromrect返回白色的钢笔
  • WPF 异步任务 阻塞 UI

    我已经与Task类型 一切都很好Task什么也不返回 例如 XAML