问题标签 [begininvoke]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1421 浏览

c# - Control.Invoke() 和 Control.BeginInvoke() - 过去的参数存储在哪里?它是如何处置的?

我已经阅读了很多关于 Control.Invoke 和 Control.BeginInvoke 并了解 InvokeSendMessage()BeginInvokeis like PostMessage(),但我不明白传递的参数列表new object[] { arg, arg, arg, ...}存储在哪里。在常规调用期间,参数被压入堆栈并在被调用函数中弹出,然后在退出后从堆栈中恢复调用帧,我假设释放对任何堆对象的任何引用,允许它们被收集。那么,Invoke/BeginInvoke存储的推送堆栈日期在哪里?一旦被调用的方法退出,它是如何处理的?

此外,我已经成功调用了一个控制方法,而没有使用传递参数加载一个新的对象数组。为什么会这样?更好的是,既然它确实有效,为什么我见过的所有例子都用一个新的对象数组来展示它?

这是我一直看到和使用的:

但这也有效:

任何信息和意见总是受到赞赏...

提前致谢。

0 投票
1 回答
514 浏览

c# - TCP 客户端填充填充绑定 DataGridView 的 DataTable,UI 无响应

首先,我正在使用 Visual Studio 10 并编写 Windows Forms App。我对 C# 中的线程没有经验。

我有一个 C# 应用程序,它使用我的 C# DLL 来侦听网络流,并解析它接收到的数据。解析后的数据用于插入/更新绑定到位于主窗体上的 DataGridView 的 Datatable 的行。

我首先使用在 DLL 中启动的工作线程进行了尝试。绑定到 DataGridView 的 DataTable 作为参数传递给 DLL。然后线程开始。线程函数是这样的;

ParseString() 方法解析数据并在 DataTable 中插入一行或更新现有行。

这段代码运行良好,直到我尝试使用 CTRL+F5 而不是 F5 运行应用程序。几秒钟后,UI 变得无响应,它开始填充网格。

我用谷歌搜索了这个,发现我应该使用 BeginInvoke 来防止 UI 冻结。但我没有成功实施。

我尝试了类似的东西

代替

但它的工作方式相同。仍然不适用于“无调试模式”。

我应该如何使用 BeginInvoke 实现这一点?还是我应该尝试别的?

0 投票
2 回答
2081 浏览

wpf - 在 UI 线程上运行昂贵的操作时保持 UI 的视觉更新

在我的 WPF 应用程序中,我需要在我的 UI 线程上运行一个昂贵的操作(我们称之为它ExpensiveUIOperation()),并且我想保持 UI 是最新的以跟踪它的进度。

为了跟踪进度,我只需要一个TextBlock,它的Text属性绑定到一个整数依赖属性PercentageComplete。在 期间ExpensiveUIOperation(),我只是根据需要设置 的值PercentageComplete

现在,我对线程有足够的了解,知道如果我只是ExpensiveUIOperation()在我的 UI 线程上运行,TextBlock 似乎不会保持最新,因为 UI 线程将被阻止,停止任何界面更新。

所以我想我可以像这样异步地做到这一点:

但这仍然行不通。在操作完成之前,文本块不会在视觉上更新。

有没有办法做到这一点?

不幸的是,在这种情况下,我不能使用后台线程,因为该操作大量使用了 UI 线程拥有的对象。

0 投票
1 回答
154 浏览

c# - 测量(和控制)用户界面某些项目的刷新时间的最佳方法

我的应用需要显示一些操作的处理时间。处理时间之一是在 UI 上刷新处理时间所花费的时间(明白吗?:D)。

操作的频率可以在 0 到大约 100 Hz (10 ms) 之间变化。

处理时间显示在一些标签中。要设置它的值,我使用这个静态方法:

问题:

  1. 我不想冻结我所有的 UI 尝试更新进程时间,那么我应该如何控制何时可以刷新?现在我正在做类似的事情:只有在上次更新时间是现在之前的 100 毫秒时才更新。
  2. 如果我使用 BegingInvoke,是否有可能因调用过多而导致队列溢出?
  3. 如何使用 BeginInvoke测量UI 刷新时间?最好的方法是使用 Invoke?
0 投票
3 回答
1147 浏览

c# - 当使用 Parallel BeginInvoke 工作而 Invoke 不工作时 - c# 4.0

当我在 AddListBoxItem 函数中使用调用时,如下所示,软件变得无响应和冻结,但如果我使用BeginInvoke,它可以工作。为什么会这样?

视觉工作室 2010 , C# 4.0

0 投票
1 回答
758 浏览

c# - 在 BeginInvoke 调用中使用 lock() 是否安全?

我有一个带有控件的表单来显示一些自定义对象。在表单中,我订阅了一个事件 AddObject,该事件将对象从服务器传入时添加到 ToAdd 列表。我设置了一个计时器,每 10 秒运行一次,以将对象从 ToAdd 列表复制到显示列表(将项目批量添加到控件比在它们进入时一次添加 1 个更有效),它绑定到控制我的表单,然后我清除 ToAdd 列表。将锁放在 BeginInvoke 内部是否安全?有没有更好的方法来做到这一点?

0 投票
1 回答
688 浏览

c# - 没有 EndInvoke 的 C# ThreadPool 或 BeginInvoke

在网上,关于如何实现“一劳永逸”模式存在非常不同的意见。

有人说,如果必须实现一种即发即弃模式,那么在不调用 EndInvoke 的情况下调用 BeginInvoke 是没有问题的。

其他人说最好创建一个单独的 ThreadPool 对象。我担心的是 ThreadPool 初始化成本。具体来说,调用的方法只是将对象添加到队列中然后返回。

为此,在池上创建线程或简单地同步调用方法是“更快”吗?我想知道一个粗略的工作阈值,这比在池上创建线程更昂贵。

是否有这方面的任何文件,以及在池中捕获异常和其他限制条件呢?

0 投票
1 回答
2707 浏览

c# - 带有 Action.BeginInvoke 的 ASP.Net 异步页面

我正在尝试在 asp .net 中编写一个异步页面,该页面在不同的线程中运行一个函数。以下代码中的问题是,当我调试它时,函数 EndAsyncOperation 永远不会被调用。结果,页面没有完全加载并且永远加载。我使用 Action 在与线程池不同的线程中运行代码。是否有另一种方法可以在另一个有效的线程中运行代码?

我哪里错了?

还有一个问题。我在 ASP .Net 中读到,页面是使用线程池运行的。那么,当我调试我的网站并尝试同时加载几个页面时,它们是如何同步加载的呢?

0 投票
1 回答
181 浏览

c# - 是否可以确定所有 Control.BeginInvoke(s) 何时完成?

在我当前的项目中,我正在使用命令提示符,并根据在 textBox 中键入的输入并按下按钮将其显示在 RichTextBox 上。

请参阅将命令提示符输出重定向到 winform 时出现 Process 类问题

我想做的一个小更新(可能不是一个特别小的更新 code-wize)是在命令提示符执行时让按钮处于“禁用”状态。由于该项目使用“Control.BeginInvoke”来更新richTextBox 上的文本,因此它是“一劳永逸”。这意味着一旦所有“BeginInvokes”都被处理到 UI 上,我就无法重新启用禁用的按钮。

我想问题是,一旦所有“BeginInvokes”都被执行并说“嘿,我完成了,这是你的按钮回来”,是否有可能获得回调。这将防止用户点击发送重复进程的按钮。

这是我正在使用的代码片段:

0 投票
1 回答
383 浏览

c# - 在 C# 中使用委托/BeginInvoke 将调用者与被调用者分离

在 C# 中,我有一个执行可能需要很长时间的操作的类层次结构。出于这个原因,我实现了一个解耦/回调机制,所以调用者不会被阻塞,而是通过回调接口通知一个动作的完成。这看起来像这样:

这是相当多的重复代码,每种方法都有细微的差异(签名)。我的问题是这是否是解决此问题的正确方法,或者 .NET/C# 是否提供任何可以使这更容易/更简洁的构造?