【问题标题】:Cross thread calls vs multiple controls跨线程调用与多个控件
【发布时间】: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


【解决方案1】:

您可以使用匿名Subs:

Me.Invoke(
    Sub()
        ' Update controls here
    End Sub)

【讨论】:

  • 我在 Private Sub Me.Invoke(Sub(),Me.UtcDateTxt.Text="140505") 中写了以下内容,VS IDE 说“单行语句的 Lambda 表达式必须完全包含一条指令”; Sub() 上的下划线。
  • @E_Blue,我不知道你从哪里得到逗号。完全按照图示使用。
  • 对不起,我的错,我把单引号(')读成了昏迷;现在可以工作了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多