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

.net - 每个 BeginInvoke 之后必须跟一个 EndInvoke 吗?

MS 文档中的此页面,涵盖 Windows 窗体应用程序中的异步,指出:

如果需要,您可以调用 EndInvoke 从委托中检索返回值,但这不是必需的。(重点补充)

该页面涵盖了异步委托的一般情况,陈述了一些不同的内容:

无论您使用哪种技术,始终调用 EndInvoke 来完成您的异步调用。

这两者似乎是直接冲突的。

哪个是真的?有人可以解释吗?

另请参阅Phil Haack 的帖子

相关:EndInvoke 是可选的,是可选的,绝对不是可选的吗?

0 投票
1 回答
2649 浏览

c# - 实现带参数调用泛型函数的超时

我正在尝试使用 Action 委托类型来在第 3 方 COM dll 中调用的方法挂断时强制超时。经过大量搜索,我发现我可以使用 Action<> 或 Func<> 并传递多达 4 个通用参数,具体取决于调用的方法是否返回参数。

对于这种情况,我希望对一系列返回 void 并采用 2 个参数的方法调用超时。下面是我整理的代码,但我无法确定如何正确编码 BeginInvoke,提示我放置“T arg1”和“T arg2”但是当我输入 param1 或 param2 VS2008 告诉我这些值是不确定的。

这是到目前为止的代码:

任何关于这里有什么问题的想法都将不胜感激。

以下是根据第一条评论重新编辑的代码

感谢您到目前为止的输入。以下编译。我似乎无法正确调用它的语法。

我试图通过调用以下方法来测试它:

但是下面的代码是不正确的:

更新的代码 我已经发布了代码供论坛用户将来参考。下面的代码似乎工作。唯一要检查的一点是,我的单元测试导致在我们“action.EndInvoke(result)”处第二次在同一个函数上调用例程时引发异常,因为结果与操作无关。这可能是因为我的 LongProcess 只是一个 Thread.sleep,在这种情况下,这意味着在我进行第二次调用时它还没有中止。

0 投票
1 回答
1604 浏览

c# - 线程和套接字

我有以下内容:

mySocket 现在在 Listen() 上循环,当我:

这是开始监听:

由于异步方法,事情并没有真正“完成”并返回一个信号让其他任何事情继续。我在上面的 Thread.Start() 之后执行的任何命令都无法正常工作。例如,在 StartListen 中,请注意我有一个isListening = true. 启动线程后,我想使用属性 IsListening。它始终返回为 false。

我应该如何启动线程。异步方法(即 ThreadStart.BeginInvoke())是否更可取?这不类似于使用 ManualResetEvent 吗?

0 投票
3 回答
6526 浏览

c# - 如何为 Control.BeginInvoke 委托 AsyncCallback 方法?(。网)

是否可以使用 Control.BeginInvoke 以除“fire & forget”之外的任何方式?我想更改以下请求以委托回调方法,以便在每个异步调用完成时我可以做一些事情。

我可以用普通的委托来做到这一点。BeginInvoke 例如

但是因为我正在调用Control .BeginInvoke 我不能这样做,因为我得到“跨线程操作无效”错误。
有人帮忙吗?

除了收到的一些答案,我将澄清“为什么”。我需要在我的 GUI 上加载/刷新控件而不锁定应用程序的其余部分。该控件包含许多控件 (ruleListCtls),它们都需要检索数据集并将其传递给它们。IE

我发现如果我提供一个委托回调方法并将任何修改控件的代码移回创建它们的主 GUI 线程(以避免跨线程错误),我可以做到这一点

这是我们在收到回调后委托给主线程的内容:

这现在工作正常。然而,除了我认为这不是特别优雅之外,主要问题是异常处理。也许这是另一个问题,但是如果 RefreshRulesDs 引发异常,那么我的应用程序将崩溃,因为该错误不是在 GUI 线程中冒泡(显然),而是作为未处理的异常。在我能捕捉到这些之前,我将不得不同步完成整个操作。如何成功捕获错误并加载其余控件?或者我如何通过适当的异常处理以另一种方式实现此异步操作?

0 投票
4 回答
4737 浏览

c# - 多个 Control.BeginInvoke/Invoke 调用会按顺序执行吗?

我需要知道 Control.BeginInvoke 和 Control.Invoke 调用是否会按照它们被调用的顺序执行。

我有以下情况:

  1. UI线程被阻塞
  2. WCF 线程调用 Control.BeginInvoke
  3. WCF 线程调用 Control.Invoke(或可能再次调用 BeginInvoke)
  4. UI线程未阻塞
  5. ??

步骤 1-4 的执行顺序保证按照显示的顺序(从技术上讲,不能保证顺序是那样的,但我的问题只有在顺序如图所示的情况下才相关)。

我的问题是,步骤 3 中的 Invoke/BeginInvoke 调用是否有可能在步骤 2 中的 BeginInvoke 调用之前执行?

另外,请不要评论阻​​塞 UI 线程。

0 投票
5 回答
17831 浏览

c# - 调用和开始调用

您好,我正在用 C# 开发一些应用程序。目前我正在处理线程,我有一个问题在我脑海中。Invoke 和 BeginInvoke 有什么区别?我阅读了一些帖子,并在这里找到了一些有用的信息:这里

但是,以下代码中的 Invoke 和 BeginInvoke 有什么区别:

其中 MyDelegate 是对 MessageHandler 函数的引用。

我注意到使用 BeginInvoke lblStatus.Text 不会刷新使用 Invoke 刷新标签的位置。此外,我知道 Invoke 等待其执行完成。我感兴趣的最重要的案例是为什么在这种情况下刷新标签文本会有所不同。

0 投票
13 回答
124638 浏览

c# - 在 C# 中做一些工作时显示进度条?

我想在做一些工作时显示一个进度条,但这会挂起 UI 并且进度条不会更新。

我有一个 WinForm ProgressForm ,ProgressBar它会以字幕方式无限期地继续下去。

现在有很多方法可以解决这个问题,比如使用BeginInvoke,等待任务完成和调用EndInvoke。或使用BackgroundWorkeror Threads

我对 EndInvoke 有一些问题,尽管这不是问题所在。问题是哪种是处理此类情况的最佳和最简单的方法,您必须向用户展示程序正在运行且不会无响应,以及如何使用最简单的代码来处理它,该代码可能高效且成功' t 泄漏,并且可以更新 GUI。

比如BackgroundWorker需要有多个函数,声明成员变量等。你还需要持有对 ProgressBar 表单的引用并处理它。

编辑BackgroundWorker不是答案,因为可能是我没有收到进度通知,这意味着不会调用,ProgressChanged因为DoWork是对外部函数的一次调用,但我需要继续调用Application.DoEvents();进度条继续旋转。

赏金是针对此问题的最佳代码解决方案。我只需要调用Application.DoEvents(),以便 Marque 进度条能够工作,而辅助函数在主线程中工作,并且它不会返回任何进度通知。我从来不需要 .NET 魔术代码来自动报告进度,我只需要一个比以下更好的解决方案:

使进度条保持活动状态(意味着不冻结但刷新品牌)

0 投票
1 回答
1014 浏览

c# - C# UserControl BeginInvoke 问题

我有一个 C# 用户控件,它有自己的后台工作线程。此工作线程在控件的构造函数中启动,并在释放控件时停止。

线程定期使用委托调用 BeginInvoke-Method,但有时会出现异常“在创建窗口句柄之前无法在控件上调用 Invoke 或 BeginInvoke”。发生。

现在我问你,只要控件没有完全创建,我如何检查是否可以从我的工作线程调用 BeginInvoke 以不调用?

此问题仅在编译版本时出现。不在调试模式。

最诚挚的问候

0 投票
4 回答
1906 浏览

.net - .NET 中的 BeginInvoke 问题

我有以下代码向 youtube 发送查询并将总结果发送到文本框。如果我只是提醒结果,没关系,但我不能将结果分配给文本框。请向我解释为什么?

和错误

跨线程操作无效:控件“txtSearch”从创建它的线程以外的线程访问。

0 投票
2 回答
2075 浏览

c# - BeginInvoke 问题(委托不执行任何操作)

希望你一切都好。

我遇到了 BeginInvoke 的一个奇怪问题,我真的很需要你的帮助!

我有一个类 Reporting ,其中包含多个 Reporting 类型的实例

它是一个显示在表单中的用户控件,同样的用户控件也用于 Windows 服务,以每分钟生成报告(并保存为图像)。

为了每分钟生成一份报告,我使用了 System.Threading.Timer。

这是我的班级在服务中生成报告的样子:

}

几乎一切都运行良好.. 除了有时 CreateReport 是在 ThreadPool 的另一个线程中执行的。因此,当我对报告及其组件(已在另一个线程中创建)执行一些操作时,InvokeRequired 设置为 true,这非常明显......但是 BeginInvoke 不执行任何操作!这几乎就像创建报告的线程不再存在......

你们对如何避免这个问题有任何想法吗?

我已经面临这个问题一个星期了,我已经用谷歌搜索和 stackoverflowed 。但什么都没有!

非常感谢 !