Tag: invokerequired

来自UI线程中的Async组件的Fire事件

我正在.Net 2.0中构建一个非可视组件。 该组件使用异步套接字(BeginReceive,EndReceive等)。 异步回调在运行时创建的工作线程的上下文中调用。 组件用户不必担心multithreading(这是主要目标,我想要的) 组件用户可以在任何线程中创建我的非可视组件(UI线程只是简单应用程序的通用线程。更严重的应用程序可以在任意工作线程中创建组件)。 组件触发事件,例如“SessionConnected”或“DataAvailable”。 问题:由于Async Callbacks和其中引发的事件,事件处理程序在工作线程上下文中执行。 我想使用一个中间层,它强制事件处理程序在首先创建组件的线程的上下文中执行。 示例代码(从exception处理等中删除…) /// /// Occurs when the connection is ended /// /// The IAsyncResult to read the information from private void EndConnect(IAsyncResult ar) { // pass connection status with event this.Socket.EndConnect(ar); this.Stream = new NetworkStream(this.Socket); // — FIRE CONNECTED EVENT HERE — // Setup Receive Callback […]

是不是一味地使用InvokeRequired只是不好的做法?

我是一名新手程序员,所以我可能在这里完全弄错了,但是这个问题让我更加困惑。 这实际上是这个问题的后续行动。 接受的答案是,您必须调用InvokeRequired以避免一些开销,因为您可能已经在UI线程上运行。 理论上,我同意它可以节省一些时间。 经过一些测试后,我发现使用Invoke的时间大约是正常调用操作的两倍(测试类似于设置标签文本n次,或者在RichTextBox中放置一个非常非常大的字符串)。 但! 然后有练习。 MSDN文档说: 此属性可用于确定是否必须调用invoke方法,如果您不知道哪个线程拥有控件,这可能很有用。 在大多数情况下,您确实知道何时尝试从另一个线程访问控件。 实际上,我能想到的唯一情况是,从一个可以被线程X调用的方法以及所有者线程访问控件时。 这对我来说是一个非常不可能的情况。 即使你真的不知道哪个线程试图操纵控件,也有一个事实是UI线程不必经常更新。 对于您的GUI,25-30 fps之间的任何内容都应该没问题。 在UI控件中进行的大多数更改所花费的时间远远少于毫秒。 因此,如果我理解正确,则必须检查是否需要调用的唯一情况是,当您不知道哪个线程正在访问控件时以及GUI更新需要超过大约40毫秒才能完成时。 然后我在http://programmers.stackexchange.com上询问了这个问题的答案。 这表明,当您不需要它时,您不应该忙于过早优化。 特别是如果它牺牲了代码的可读性。 所以这让我想到了一个问题:当你知道一个不同的线程访问一个控件时,你不应该只使用invoke,并且只有当你知道你的UI线程可以访问那段代码并且你发现它应该运行得更快,那么你应检查是否需要调用? PS:在校对我的问题之后,听起来真的像我在咆哮。 但实际上我只是好奇为什么InvokeRequired似乎被许多经验丰富的程序员过度使用。

当我没有Control可用时如何调用()

我正在编写一个连接处理程序(一个请求用户名和密码的对话框)。 代码是一个显示对话框的处理程序。 这个代码可以从一个线程Invoke() ,所以如果InvokeRequired我需要Invoke() 。 在理想情况下,我可以初始化然后使用Control来执行InvokeRequired处理程序,但有时Control可以为null。 可能吗? 我怎么能实现代码? 以下是否正确? public class GuiCredentialsHandler { // control used to invoke if needed private static Control mInvokeControl; /// /// Initialize a GetCredentials handler for current process. /// This method should be always called from the main thread, for /// a correctly handling for invokes (when the handler is […]

C#跨线程调用问题

我正在用c#编写一个表单应用程序,我需要能够从任何线程更改Rich Text Box的内容,我尝试使用委托和InvokeRequired ,但我做的委托仍然给我一个跨线程调用错误,和InvokeRequired崩溃表单,而不会给出错误。 函数我需要能够从任何线程执行: public static void updateSub(int what) { subDisplay.subBox.Text = tb[what]; } 我试图使用的代表: public delegate void UpdateDelegateVoid(int what); static public UpdateDelegateVoid uSub = new UpdateDelegateVoid(updateSub); uSub(0); 我的InvokeRequired代码: public static void updateSub(int what) { if (subDisplay.subBox.InvokeRequired) { subDisplay.subBox.Invoke(new MethodInvoker(finish)); } else { subDisplay.subBox.Text = tb[what]; } } 我不确定为什么上面的代码不起作用。 谢谢!