如何在长时间运行的功能期间更新 UI(文本字段)?

2023-12-27

我知道这个问题可能没有意义,而且我很难想出一种方法来解释它,所以我将展示一段代码来提供帮助。我在 Visual Studio Express 2010 上使用 Winforms:

private void button1(object sender, EventArgs e)
    {
        txtOutput.Text += "Auto-collecting variables. This may take several minutes";
        string v = foo();
        txtOutput.Text += "\n" + v;
        string b = bar();
        txtOutput.Text += "\n" + b;

        txtOutput.SelectionStart = txtOutput.Text.Length;
        txtOutput.ScrollToCaret(); //scrolls to the bottom of textbox
    }

所以基本上,当用户单击button1时,我希望“自动收集变量...”显示在文本框中,然后执行 foo() ,显示该内容,然后执行 bar() ,然后显示该内容。

当前发生的情况是 foo() 和 bar() 执行,然后在 foo() 和 bar() 执行后立即显示所有内容(需要几分钟的函数)。有没有办法解决这个问题,或者有解决办法吗?

编辑:C# 的版本是 4.0。如果我更新到 4.5 或 5.0,没有 .NET 4.5/5.0 的计算机是否能够运行 .exe?


C# 5.0 使这一切变得微不足道。

使用以下命令在后台线程中执行长时间运行的任务Task.Run并使用await将方法的其余部分作为 UI 线程中的延续执行,而不会在异步任务期间阻塞 UI 线程。

private async void button1(object sender, EventArgs e)
{
    txtOutput.Text += "Auto-collecting variables. This may take several minutes";
    string v = await Task.Run(() => foo());
    txtOutput.Text += "\n" + v;
    string b = await Task.Run(() => bar());
    txtOutput.Text += "\n" + b;

    txtOutput.SelectionStart = txtOutput.Text.Length;
    txtOutput.ScrollToCaret(); //scrolls to the bottom of textbox
}

您可以在 C# 4.0 中执行相同的操作,如下所示:(第一个解决方案将由编译器转换为类似的内容。)

private  void button1(object sender, EventArgs e)
{
    txtOutput.Text += "Auto-collecting variables. This may take several minutes";
    Task.Factory.StartNew(() => foo())
        .ContinueWith(t => txtOutput.Text += "\n" + t.Result
            , TaskScheduler.FromCurrentSynchronizationContext())
        .ContinueWith(t => bar())
        .ContinueWith(t =>
        {
            txtOutput.Text += "\n" + t.Result;
            txtOutput.SelectionStart = txtOutput.Text.Length;
            txtOutput.ScrollToCaret(); //scrolls to the bottom of textbox
        }
            , TaskScheduler.FromCurrentSynchronizationContext());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在长时间运行的功能期间更新 UI(文本字段)? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 如何在 Sitecore 内容交付服务器上重建自定义 Lucene 索引?

    我的 Sitecore 6 2 Content Delivery 服务器上的自定义 Lucene 索引似乎不正确 所以我想我需要重建所有 3 个自定义索引 我怎么做 我是否只需使用共享源索引查看器模块 现在我已经将其安装在我的 CD 服务器
  • 如何将 iPhone-Wax 嵌入到应用程序中

    我刚刚了解了 iPhone Wax 感谢 SO 现在 对于我想要做的事情来说 文档相当稀疏 我想将它嵌入到 Objective C 应用程序中 我不希望它成为主要应用程序 有人做到了吗 我怎样才能实现它 我想以与使用 LuaObjectiv
  • 如何将 XDebug zend_extension 添加到 php.ini?

    我有一个带有 cPanel WHM 的 VPS 并且正在尝试启用 XDebug 我通过以下方式安装了扩展程序WHM gt Software gt Module Installers gt PHP Pecl gt Manage我通过检查我的p
  • 如何替换数组的元素?

    如何替换数组中的元素 a 1 2 3 4 5 我需要将 5 替换为 11 22 33 44 flatten so that a现在变成 a 1 2 3 4 11 22 33 44 不确定您是否想要替换特定值 但这有效 a 1 2 3 4 5
  • 如何获取 crtdbg.h 文件?

    我在用MinGW http en wikipedia org wiki MinGW GCC Eclipse http en wikipedia org wiki Eclipse 28software 29在 Windows 上 我遇到了这个
  • 如何悬停固定元素直到到达某个点

    我有一个 div 需要将其固定在屏幕底部 直到滚动到某个点并停在那里并停留 如果用户开始向后滚动 在经过同一点后再次将其固定 关于如何实现这一点有什么想法吗 编辑 这是我当前的代码 不起作用 window scroll function i
  • SQl:从文本文件更新表

    这是我必须做的 我有一个包含 3 列的文本文件 PID X Y 现在我的数据库中有两个表 Table 1包含 4 列 UID PID X Y Table 2包含多列 必需的列是UID X Y 我需要更新Table 2具有相应的 X 和 Y
  • 如何用正则表达式模式替换文本并在替换文本中集成计数器?

    function parse string counter 0 string preg replace b b si span class b counter 1 span string 1 counter return string 我正
  • ggplot2 中两种不同颜色美学映射的不同调色板

    我的问题非常类似于this https stackoverflow com questions 15363035 ggplot2 how to specify multiple fill colors for points that are
  • D3 旭日。如何设置不同的环\层宽度

    帮助 我已经搜索了很长时间 但没有找到任何与此相关的信息 我基本上希望能够设置 D3 sunburst 中每个图层的大小 像素 相对 我不介意 我猜这可以在数据或基于数字或父母的代码中完成 我有一个旭日纹 希望内环占据大部分空间 而外环只是
  • 存储过程 azure Cosmos DB 返回空集合

    我尝试使用 Azure 文档中的示例 sp 创建代码创建存储过程 但无法获取集合详细信息 它总是返回 null 存储过程 SAMPLE STORED PROCEDURE function sample prefix var collecti
  • 拖动 JPanel

    我在尝试拖动 JPanel 时遇到问题 如果我纯粹在 MouseDragged 中将其实现为 public void mouseDragged MouseEvent me me getSource setLocation me getX m
  • MongoDB 字段数组搜索(C#,如何?)

    请告诉我如何通过字段数组进行搜索 我有一些类型的字段List
  • 我应该修改 String 的原型吗?

    我本来打算在 javascript 中创建一个修剪函数 但由于我不想重新发明轮子 所以我在谷歌上搜索了这个方法 我找到了这个链接http www somacon com p355 php http www somacon com p355
  • 比较两个对象(不包括一些属性)的最快方法?

    我有一个网站 用户将数据上传到其中 我只想更新属性已更改的数据 因此 我正在比较 2 个相同类型的对象的更改 并且我需要排除一些属性 例如 ModifiedOn 日期 这是迄今为止我使用反射的代码 private bool hasChang
  • 无法在Jboss EAP 7.0服务器中创建oracle数据源

    我需要在JBOSS EAP 7 0服务器中创建oracle数据源 我部署了ojdbc6 jar从 JBOSS 管理 CLI 命令行界面 使用以下命令 deploy
  • 计算时差超过 24 小时

    我遇到一个问题 我试图计算以秒为单位的时间差 然后在报告 访问报告 中我将总结这些秒并将其格式化为 hh nn ss 但是 我收集两个字段之间的时间差的计算字段有时会超过 24 小时 从而消除了时间差 我正在使用 DateDiff 函数 D
  • 有关 EF Code First Fluent API、TPH 和外键的困难

    我的数据库中有两个表 一种叫做Users 另一个称为Widgets The Widgets表代表我的代码模型中的 3 个实体 其中一个实体 Widget 是其他两个实体的父类 WidgetTypeA and WidgetTypeB Both
  • g++ 编译和链接选项

    也许是天真的问题 g 是否有单独的编译和链接选项列表 我的意思是一个显示哪些选项用于编译 哪些选项用于链接的列表 gcc 手册说这些是链接选项 http gcc gnu org onlinedocs gcc Link Options htm
  • 如何在长时间运行的功能期间更新 UI(文本字段)?

    我知道这个问题可能没有意义 而且我很难想出一种方法来解释它 所以我将展示一段代码来提供帮助 我在 Visual Studio Express 2010 上使用 Winforms private void button1 object sen