问题标签 [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 投票
7 回答
65077 浏览

c# - 在 C# 中调用 BeginInvoke/Invoke 时如何获取返回值

我有这个应该是线程安全的小方法。一切正常,直到我希望它具有返回值而不是 void。调用 BeginInvoke 时如何获取返回值?

编辑:我想在这种情况下不需要 BeginInvoke,因为在线程可以继续之前我需要来自 GUI 的值。所以使用 Invoke 也很好。只是不知道如何在以下示例中使用它来返回值。

但也不确定如何使用该代码获得价值;)

0 投票
2 回答
11717 浏览

vb.net - 委托,开始调用。EndInvoke - 如何清理对同一委托的多个异步威胁调用?

我创建了一个我打算调用 Async 的委托。

模块级别

我在方法中使用的以下代码

该方法运行并执行所需的操作

Asyn 回调在我执行 EndInvoke 的完成后触发

只要在委托上启动 BeginInvoke 的方法仅在没有 BeginInvoke/Thread 操作正在运行时运行,它就可以工作。问题是可以调用一个新线程,而委托上的另一个线程仍在运行并且还没有被 EndInvoke'd。

如有必要,程序需要能够让委托一次在多个实例中运行,并且它们都需要完成并调用 EndInvoke。一旦我开始另一个 BeginInvoke,我就会失去对第一个 BeginInvoke 的引用,因此我无法使用 EndInvoke 清理新线程。

克服此问题的干净解决方案和最佳实践是什么?

0 投票
2 回答
2471 浏览

c# - 为什么在这里使用 BeginInvoke?

我正在研究其他人的代码,并且对与多线程有关的任何事情都没有太多经验。我遇到了这行代码:

BeginInvoke((MethodInvoker)delegate() { btnCalibrate.PerformClick(); });

我想知道为什么这样做会起作用:btnCalibrate.PerformClick();

感谢您的回答。

0 投票
2 回答
607 浏览

c# - 为什么这个后台工作人员代码会导致此错误:参数计数不匹配

下面这段代码有什么问题?conn_PageDeleted 来自后台线程,每次收到回电时我都会尝试更新标签。我收到一条错误消息

参数计数不匹配。

这是代码:

0 投票
4 回答
1634 浏览

.net - 为什么你可以在同一个委托实例上多次调用 BeginInvoke?

我认为BeginInvoke在同一个委托实例上多次调用会导致问题,但我尝试了它并且它有效。这是为什么?

返回的IAsyncResult对象是否与每个BeginInvoke调用的唯一而不是委托的每个实例一起返回?

换句话说,我是否只需要一个委托实例来产生对其函数的多次调用?

0 投票
4 回答
2250 浏览

c# - BeginInvoke 的性能影响

我继承了从主线程(不是后台线程,通常是模式)调用 BeginInvoke 的代码。我试图了解它在这种情况下的实际作用。

BeginInvoke 中调用的方法是否与到达窗口的消息一致?文档说asynchronously,这是我的假设。

框架如何确定何时启动 BeginInvoke 调用的方法的优先级?

编辑:代码如下所示:

这发生在 Form_Load 事件中。

0 投票
1 回答
2274 浏览

c# - Silverlight 4 访问 WCF 数据服务:BeginInvoke 受挫

我正在尝试遵循使用 Silverlight 4 beta 执行 WCF 数据服务查询的模式。以下是我的代码:

这是从我遇到的使用 silverlight 的 WCF 数据服务的一些示例中得出的。不幸的是,无论我如何尝试实现代码,我都会在“Dispatcher.BeginInvoke”上遇到以下错误:

'非静态字段、方法或属性需要对象引用 (System.Windows.Threading.Dispatcher.BeginInvoke(System.Action)'

0 投票
1 回答
522 浏览

gridview - Why doesnt the AsyncCallback update my gridview?

I started working with delegates last week and i am trying to update my gridview async on the background. All goes well, no errors or such but i dont get a result after my EndInvoke. does anyone know what i am doing wrong?

Here is a code snippet:

0 投票
3 回答
4274 浏览

.net - 在.net中实现多线程的不同方法是什么

几天来我一直在与多线程作斗争。

我不明白有什么不同的方式multithreading。我已经阅读了一些backgroundWorker关于创建线程对象的内容。昨天我在示例中看到delegate通过调用BeginInvoke.

我不明白这些不同的方式是multithreading在同一个背景类上工作还是相同的工作。请帮我说清楚。

0 投票
4 回答
2792 浏览

.net - 与从非 GUI 线程显示 MessageBox 相关的问题

我正在开发一个大量数据绑定的 Win.Forms 应用程序,在该应用程序中我发现了一些奇怪的行为。该应用程序具有单独的 I/O 线程,通过异步 Web 请求接收更新,然后将其发送到主/GUI 线程以处理和更新应用程序范围的数据存储(这反过来可能是数据绑定到各种 GUI 元素, ETC。)。Web 请求另一端的服务器需要定期请求或会话超时。

我已经尝试了几种处理线程问题等的解决方案,并且观察到以下行为:

  1. 如果我使用 Control.Invoke 将更新从 I/O 线程发送到主线程,并且此更新会导致显示 MessageBox,则主窗体的消息泵会停止,直到用户单击确定按钮。这也会阻止 I/O 线程继续运行,最终导致服务器超时。

  2. 如果我使用 Control.BeginInvoke 将更新从 I/O 线程发送到主线程,则主窗体的消息泵不会停止,但如果更新处理导致显示消息框,则处理其余部分该更新将暂停,直到用户单击“确定”。由于 I/O 线程一直在运行并且消息泵一直在处理消息,因此可能会在消息框完成之前调用多个 BeginInvoke 进行更新。这会导致不可接受的无序更新。

  3. I/O 线程将更新添加到阻塞队列(非常类似于在 .NET 中创建阻塞队列<T>?)。GUI 线程使用 Forms.Timer 定期应用阻塞队列中的所有更新。这个解决方案解决了阻塞 I/O 线程和更新顺序的问题,即下一次更新在前一次完成之前永远不会开始。但是,性能成本很小,并且在显示更新时引入了延迟,从长远来看是不可接受的。我希望主线程中的更新处理是事件驱动的,而不是轮询。

所以我的问题。我应该如何做到这一点:

  1. 避免阻塞 I/O 线程
  2. 保证更新按顺序完成
  3. 保持主消息泵运行,同时显示一个消息框作为更新的结果。

更新:请参阅下面的解决方案