【发布时间】:2014-05-13 15:35:47
【问题描述】:
我有一个 Winform GUI,它有一个 UDPClient 侦听器线程在第二个平面上工作,以避免停止 GUI;当线程在 WinForm 代码中收到调用 Sub 的东西时; Sub 处理数据,必须根据接收到的数据填充不同的 TextBox。
如您所知,如果我尝试从 Sub 更改任何控件的文本属性,我将收到一个跨线程错误。 所以为了避免我为一些控制(只是一个测试)做了一些代表并且工作正常。
但是 WinForm 有超过 100 个控件,我想知道是否有一些方法可以用更少的代码来实现。
通过搜索发现这两个问题。
Multi-threaded WPF Application: Dispatcher Invoke. A more efficient way?
Change WPF controls from a non-main thread using Dispatcher.Invoke
在他们谈论使用 Dispacher 的第一个链接上,类似
Public Shared Sub UiInvoke(a As Action)
Application.Current.Dispatcher.Invoke(a)
End Sub
我在表单中编写了该代码,但 IDE(VS2010/NET4.0) 说“当前”不是成员。
我想我错过了一些东西,我以前从未使用过或做过类似 Dispacher 的东西,我通常使用 Delegates。
我做错了什么?还有另一种方法可以用一个代表控制许多控件吗? 我只需要读取或写入 text 属性。
【问题讨论】:
-
不使用 application.current 开始购买 - 可能有多个调度员。得到窗户上的驱散者。
-
你在说做类似的事情吗? 'code' 公共共享子 UiInvoke(ByVal a As Action) Dispatcher.Invoke(a) End Sub 'code'
-
是的。有一天,您可能会发现具有多个 UI 线程的代码,每个线程运行一个或多个窗口。这很容易实现,但它使应用程序级别的“当前”调度程序的概念完全没有实际意义。
-
您使用的是 winforms 还是 WPF?你的问题完全不清楚。 WPF 解决方案在 winforms 中不起作用,顺便说一句,您根本不想使用 winforma。
-
@HighCore - 我使用的是 WinForm,我认为它是相同的,只是称为不同。
标签: winforms vb.net-2010