问题标签 [invokerequired]

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 投票
1 回答
238 浏览

.net - 总是使用 Form.Invoke() 是一种不好的做法吗?

我知道,这可能是一个非常简单的问题,但我不能确定。我在一个模块中有这个:

这在我的名为 Form1 的主要形式中:

我有许多其他类、模块和线程,并且没有使用InvokeRequired,我使用它来从任何地方调用委托。我的意思是来自其他线程、类、模块等。

代替:

这是一个不好的做法吗?真的有InvokeRequired每次检查的目的吗?

0 投票
2 回答
299 浏览

.net - .NET 调用流程

我一直看到/使用某种形式或方式的代码:

我的问题是......当我使用 GUI 线程时会发生什么Invoke?是否像中断一样,线程将立即执行method1

0 投票
2 回答
1234 浏览

c# - 跨线程 InvalidOperationException,InvokeRequired == false 时被 2 个线程同时访问

一个控件由两个工作线程访问,第二个工作线程在第一个工作线程完成它对控件的工作之前。第二个线程 (9) 获取 InvokeRequired == false,然后第一个线程 (17) 在子控件上调用 .Refresh 时获取异常。

这是预期的行为吗?究竟是什么导致线程将控件的 InvokeRequired 视为真/假?
最后,什么是一个好的解决方案。在所有调用语句上加一个锁,并让它们调用一个单独的方法(显然是为了避免死锁)?

输出:

0 投票
4 回答
55092 浏览

c# - wpf中的InvokeRequired

我在一个应用程序中使用了这个函数Windows forms

但在WPF它不起作用。为什么?

0 投票
1 回答
75 浏览

multithreading - 调用 Windows 窗体线程并休眠

我有一个托管的 c++ 应用程序,我启动一个新线程来做一些事情并更新一些文本框,它循环并在每个循环结束时休眠。因为它在睡觉,所以我需要将它放在一个新线程中,这样 UI 就不会崩溃。然后我意识到我需要调用创建 UI 的线程来访问文本框,但现在我回到了主线程中,所以睡眠崩溃了。我应该如何处理这个问题。

0 投票
1 回答
94 浏览

vb.net - 替换INVOKE的方法

有没有办法对在其他线程中创建的对象使用InvokeandInvokeRequired方法?有没有一种更直接且内存占用更少的方法?也许是状态机或线程控制?

我是否在浪费时间担心这种方法的资源使用情况?

我正在使用这种调用方法:http ://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/

我在 VS 2012 中使用 VB.NET

0 投票
1 回答
220 浏览

c# - 如何确保 InvokeRequired 不会中止?

这是我的代码:

但我注意到,如果我捕捉到一个异常,return可以在所有txtMonitor.InvokeRequired都发送到 UI 之前采取行动,并且我丢失了一些“消息”。

我怎样才能避免这种情况?

0 投票
1 回答
134 浏览

c# - 'Invoke' 和 'BeginInvoke' 被调用但从未解决

我正在处理一个软件的 GUI 线程。我必须在需要从底层 API 不断轮询的 GridView 数据中显示。我创建了一个名为更新数据的方法,并尝试使用and/orSync()使其线程安全。该方法每五秒左右由一个计时器调用一次。BeginInvokeInvokeSync

的主体Sync从未被调用,因为出于某种原因,我的请求似乎从未从消息泵中提取。编码:

日志如下所示:

永远不会打印其他消息。

对于BeginInvoke. “End Invoke ...”被打印,但“inside body ...”从不打印。

我在 Unity3D 和 MonoDevelop 之上运行(如果这改变了任何东西)。

0 投票
2 回答
4110 浏览

c# - 方法被调用后执行两次

我遇到了无法解决的“调用”问题。我会尽量详细地描述我的描述,但我是新手,所以请耐心等待,如果您需要更多信息,请告诉我。

我有一个后台线程正在运行,当提示时将禁用在主线程上创建的表单上的一堆复选框。为了做到这一点,我需要使用一个invoke和一个委托安全地跨线程,但我必须做错了。底线,当我在调试器中检查这个时,我发现它在代码的 ACTION 部分运行了两次 if InvokeRequired。我可以通过用 括住 ACTION 来解决这个问题else,虽然它不会运行else两次,但它仍然会尝试再次执行该方法。

我只想知道为什么它会两次运行该方法。如果您需要更多信息,请告诉我,我很乐意与您分享。

0 投票
2 回答
1220 浏览

c# - 盲目使用 InvokeRequired 不是不好的做法吗?

我是一个新手程序员,所以我在这里可能完全误会了,但是这个问题让我感到不安。

这实际上是这个问题的后续行动。

公认的答案是,您必须调用 InvokeRequired 以避免一些开销,因为您有可能已经在 UI 线程上进行操作。

从理论上讲,我同意它可以节省一些时间。经过一些测试,我发现使用 Invoke 所花费的时间大约是正常调用操作的两倍(测试比如设置标签的文本 n 次,或者在 RichTextBox 中放置一个非常非常大的字符串)。

但!然后是练习。

MSDN 文档说:

此属性可用于确定是否必须调用调用方法,如果您不知道哪个线程拥有控件,这可能很有用。

在大多数情况下,您确实知道何时尝试从另一个线程访问控件。实际上,我能想到的唯一情况是,当从可以由线程 X 以及所有者线程调用的方法访问控件时。这对我来说是一个非常不可能的情况。

即使您真的不知道哪个线程试图操纵控件,也有一个事实是 UI 线程不必那么频繁地更新。25-30 fps 之间的任何内容都适合您的 GUI。并且在 UI 控件中所做的大多数更改都需要不到几毫秒的时间来执行。

因此,如果我理解正确,您必须检查是否需要调用的唯一情况是当您不知道哪个线程正在访问控件并且 GUI 更新需要超过 40 毫秒才能完成时。

然后是我在http://programmers.stackexchange.com上提出的这个问题的答案。这表明您不应该在不需要时忙于过早的优化。特别是如果它牺牲了代码的可读性。

所以这给我带来了我的问题:当你知道不同的线程访问控件时,你不应该只使用调用吗,并且只有当你知道你的 UI 线程可以访问那段代码并且你发现它应该运行得更快时,你应该检查是否需要调用?

PS:在校对我的问题后,听起来我真的在咆哮。但实际上我只是好奇为什么 InvokeRequired 似乎被许多比我更有经验的程序员过度使用。