使用 TPL 时避免窗口 (WPF) 冻结

2024-01-10

我正在构建一个 WPF,它有一个在 sql server 中执行 sql 查询的按钮(该查询可能需要很长时间才能运行)。 我想使用 TPL 来做到这一点。

这段代码: var result = Task.Factory.StartNew(() => { command.ExecuteNonQuery(); });

给出了这个例外: ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态已关闭。

我想这是因为查询在不同的线程上运行并且不知道打开的连接。

我有两个问题: 1. 如何让新线程知道这个打开的连接? 2.解决此问题后,如何使窗口不因该查询而冻结。

Thanks


您必须在任务主体中创建并打开此命令的连接。要么不关闭任务外部的连接,我认为这就是您在这里所做的,但无法从您粘贴的一行代码中看出。

我个人会在任务主体内完成这一切。如果用户不需要的话,为什么他们必须等待您甚至获得连接/命令设置?此外,您的连接也有可能是共享实例,并且无法跨线程工作。

一旦将数据库工作放入任务中,默认情况下它将在线程池线程上执行,这将释放 WPF 调度程序线程以返回处理 UI 事件,从而防止“冻结”。您很可能希望在数据库任务完成后更新 UI,为此您只需添加一个延续任务,但为了能够从该延续任务操作 UI,您需要确保它被显式安排为在调度程序线程上运行。这是通过在调度延续时显式指定当前同步上下文的 TaskScheduler 来完成的。那看起来像这样:

Task backgroundDBTask = Task.Factory.StartNew(() =>
{
    ... DB work here ...
});

backgroundDBTask.ContinueWith((t) =>
{
    ... UI update work here ...
},
TaskScheduler.FromCurrentSynchronizationContext());

这里的神奇之处在于使用TaskScheduler::FromCurrentSynchronizationContext方法,该方法将安排在当前调用的 Dispatcher 线程上执行的延续。

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

使用 TPL 时避免窗口 (WPF) 冻结 的相关文章

随机推荐

  • 如何让子进程每 5 秒暂停一次外部程序的执行?

    给定一个外部程序 在本例中是python target py 目标 py import time itertools A itertools count while True time sleep 1 print A next 我正在寻找一
  • Nod32 导致 LocalHost(ASP.NET 开发服务器)“连接中断”问题

    我引用我自己之前要求进一步解释的问题 我正在尝试使用 C 运行一个新创建的 ASP NET 网站 但是当我这样做时 它会启动 FireFox 并尝试连接到http localhost 1295 WebSite1 Default aspx h
  • 如何验证 Laravel 中更新用户的唯一电子邮件?

    我正在使用 Laravel 5 2 想要使用验证器更新用户帐户 我想保持电子邮件字段的唯一性 但是 如果用户输入当前的电子邮件 它将中断 如果电子邮件是唯一的 除了用户自己的当前电子邮件之外 我该如何更新 您可以告诉验证者 email gt
  • 从随机访问文件读取对象时 C++ 程序崩溃

    我有以下 User h 其中包含多个属性 字符串 User cpp 包含所有定义 User h ifndef USER H define USER H include
  • 如何使用 openpyxl 写入 xlsm

    我正在写这段代码 我的目标是在此 Excel 文件的特定单元格中设置一个值 代码运行正常 退出时没有错误 但单元格 A1 仍为空白 我怎样才能解决这个问题 import openpyxl wb load workbook Test xlsm
  • 无法通过 RVM 安装 Ruby 2.0.0

    我继承了一个遗留代码库 需要使用 RVM 安装 Ruby 2 0 0 我使用的是 Mac OS X Catalina Ruby 2 0 0 的安装程序根本不起作用 以下是我的安装尝试 从 RVM 本身的安装一直到尝试安装 Ruby 2 0
  • 如何使用 Aurelia 通过单击内部锚链接保持在同一页面上?

    我正在为一个项目制定样式指南 目前我希望在锚链接上有一个基本的点击行为 以便它们滚动到相应的 ID 举个例子 a href section a 向下滚动到 div div 在 Aurelia 中 默认行为是将链接视为路由 我无法使内部链接正
  • 以编程方式调用 DockPanel-Suite 的“AutoHidden”DockContent

    我无法以编程方式显示 自动隐藏 底座 虽然在网上找不到任何答案 但如下那么问题 https stackoverflow com questions 12956147 dockpanel suite dockcontent visibilit
  • Swift 项目中链接的框架和库

    我的 iOS 应用程序播放声音AVPlayer 为此 我必须在类的顶部输入以下内容 import AVFoundation 我有 Objective C 背景 所以我去了 Xcode 项目General选项卡并添加AVFoundation单
  • 触摸移动被卡住 忽略取消触摸移动的尝试

    我正在处理触摸滑块上的触摸事件 并且不断收到以下错误 忽略使用 cancelable false 取消 touchmove 事件的尝试 例如 因为滚动正在进行中并且无法滚动 打断了 我不确定是什么导致了这个问题 我是触摸事件的新手 似乎无法
  • 如何让一个简单的Hello World在Windows中“隐形”(C/C++)

    你好 我想知道是否可以在 Windows 中使一个简单的 Hello World 程序 然后前进到实际的程序 不可见 我的意思是 当我执行该程序时 不会有任何图形指示 没有cmd打印 Hello world 没有任务栏标签 没有系统托盘图标
  • android中如何禁止点击ListView?

    我有一个 ListView 我正在用数据库中的值填充它 如果数据库为空 我将 ListView 的第一项设置为 无数据 我想禁止点击该项目 我用过ArrayAdapter 我尝试将 areAllItemsEnabled isEnabled
  • 如何在 Kusto 中创建任意大小的窗口?

    Using prev https learn microsoft com en us azure data explorer kusto query prevfunction函数我可以单独访问前几行 mytable sort by Time
  • 如何获取用户玩我的游戏的时间? Steamworks API

    如何获取用户玩我的游戏的时间 在 Unity 中使用 Steamworks API 和 C 我已经浏览了文档 但没有找到类似的内容 并认为我遗漏了一些东西 我应该使用一个简单的脚本来记录自己游戏中的比赛时间 但为时已晚 如果有人能给我一个打
  • 当Java TimerTask在Timer中被调度时,它是否已经“执行”了?

    我想澄清一些关于 TimerTask 的事情 当你有下面的代码时 timer schedule task 60000 如果任务计划在接下来的 1 分钟内运行 则任务对象是否已经在执行 因为在我的代码中的某个地方我调用了 task cance
  • 使用 HTML5 数据属性的 AJAX 响应

    我有一个工作环境 我使用 AJAX 响应来填充 HTML 元素 例如 AJAX 响应有两个 或 n 个 对象 如下所示 0 Object id 111 Name abc 1 Object id 112 Name xyz 然后 已经有两个 或
  • 错误消息无法打开包含文件:'gxall.h':没有这样的文件或目录

    我正在尝试构建一些旧的 Visual C 代码 当我这样做时 我收到此错误消息 fatal error C1083 Cannot open include file gxall h No such file or directory 我该如
  • AWS Lambda 任务在 6.00 秒后超时

    我正在使用无服务器框架 我的 Lambda 函数连接到 DynamoDB 表以更新表中的项目 表的读写容量单位为 5 并且 auto scaling 被禁用 AWS Lambda 函数分配了 128MB 内存 我使用 Jmeter 进行性能
  • C++ 中的对话框未接收到某些击键

    当我 最终 学习用 C 编写 Windows 应用程序时 我偶然发现了这一点 我有一个用它创建的对话框CreateDialog 我还有一个默认按钮 然而 每次我按下TAB or ENTER 什么也没有发生 控制焦点也没有改变 默认按钮也没有
  • 使用 TPL 时避免窗口 (WPF) 冻结

    我正在构建一个 WPF 它有一个在 sql server 中执行 sql 查询的按钮 该查询可能需要很长时间才能运行 我想使用 TPL 来做到这一点 这段代码 var result Task Factory StartNew gt comm