使用 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) 冻结 的相关文章

  • WPF 中 ToggleButton 的 IsChecked 属性的 OneWay 绑定

    我有一个ToggleButton以其IsChecked使用 OneWay 绑定将属性绑定到属性
  • 强制窗口在打开时获得焦点

    我有一个 WPF 应用程序 它通过套接字连接与 C MFC 应用程序进行通信 如果用户按下 C 应用程序中的特定按钮 则会显示一个新的 WPF 窗口 以下是调用以启动 WPF 窗口的代码 var window new Window wind
  • 从任务并行库更新 ProgressBar UI 对象

    基本上我想更新 FormMain WindowsForm 上的 ProgressBar UI 对象 我正在使用 NET 4 0 以下是 Form1 Designer cs 中的代码 namespace ProgressBarApp publ
  • 如何从页面级别获取父框架?

    我有一个带有框架和几页的窗口 加载窗口时 框架导航到欢迎页面 当我单击欢迎页面内的按钮时 我希望父框架导航到另一个页面 为此 我需要从页面级别访问父框架 但我不知道如何执行此操作 我尝试了下面的代码 但它返回 null private vo
  • 如何使用 C#8 IAsyncEnumerable 异步枚举并行运行的任务

    如果可能的话 我想为并行启动的任务创建一个异步枚举器 因此 首先完成的是枚举的第一个元素 第二个完成的是枚举的第二个元素 依此类推 public static async IAsyncEnumerable
  • MultiDataTrigger 使用 OR 而不是 AND

    我正在尝试设置多个DataTriggers on my Button 我做了一些研究发现MultiDataTrigger允许您执行此操作 我想要Visibility我的财产Button如果设置为 falseCCTVPath string E
  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • 为什么无法将 WPFToolkit DataGrid ItemSsource 绑定到 DataTable?

    In a Telerik控制 我能够绑定DataTable直接到ItemSource 但是当我切换到 Codeplex 时WPFToolkit Datagrid
  • 示例代码中是否需要Task.WhenAll?

    下面的代码中task1和task2是相互独立的 可以并行运行 下面两个实现有什么区别 var task1 GetList1Async var task2 GetList2Async await Task WhenAll task1 task
  • 我可以禁用特定控件的键盘输入吗?

    是否可以禁用控件的键盘输入 例如一个ListView 我怎么做 我尝试过覆盖KeyUp KeyDown事件 但显然不是这样的 IsEnabled是一个很好的解决方案 但是我只想禁用键盘交互并保持鼠标交互不变 处理KeyDown事件来得太晚了
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何在Wpf中的用户控件中调用MahApps Metro对话框

    当我尝试调用 MahApps Metro 对话框时 我在传递值时遇到错误 在传递参数时调用对话框控制时我需要传递 Metrowindow 参数 但我需要在用户控件中调用它 下面是当我需要对话框控制时我将调用的方法 public async
  • 列表视图上的 TextBlock:如何忽略 TextBlock 中的点击并让列表视图处理它们

    我有一个显示大量信息的列表视图 但是当它为空时 我想在其上覆盖一个文本块 上面写着 没有要显示的信息 或 bla bla bla 添加信息 列表视图设置为响应鼠标单击 但现在如果我单击文本块 这些事件将路由到文本块 我怎样才能让这些事件转到
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 取消任务

    我尝试运行一个关于取消任务的简单示例 如下所示 CancellationTokenSource tokenSource2 new CancellationTokenSource CancellationToken token2 tokenS
  • 将 PDF 嵌入到 WPF 应用程序中

    我正在尝试在 WPF 应用程序中嵌入 显示 PDF 到目前为止 我已经尝试过这些解决方案 但没有成功 在 a 中显示 PDFWindowsFormsHost主持一个AxAcroPdf控制 类似于显示的内容here http hugeonio
  • WPF:Prism 对于小型应用程序来说是不是太过分了?

    如果我不将我的应用程序分成不同的模块 否则我会认为 Prism 确实是可行的方法 我应该使用 Prism 吗 我知道 Prism 提供了一个方便的实现ICommand 我可以自己在一页代码中完成 并为我们提供IEventAggregator
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表

随机推荐

  • 如何让子进程每 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