当前位置: 首页 > 编程笔记 >

Visual Basic .NET使用Control.Invoke()执行线程安全的调用

轩辕亮
2023-03-14
本文向大家介绍Visual Basic .NET使用Control.Invoke()执行线程安全的调用,包括了Visual Basic .NET使用Control.Invoke()执行线程安全的调用的使用技巧和注意事项,需要的朋友参考一下

示例

使用该方法,您可以将方法或函数的执行从后台线程移至创建控件的线程,通常是UI(用户界面)线程。这样,您的代码将排队等待在控件的线程上运行,从而消除了并发的可能性。Control.Invoke()

Control.InvokeRequired还应该检查该属性以确定您是否需要调用,或者代码是否已经在与控件相同的线程上运行。

该Invoke()方法将委托作为其第一个参数。委托将引用,参数列表和返回类型保存到另一个方法。

在Visual Basic 2010(10.0)或更高版本中,可以使用lambda表达式动态创建委托方法:

IfLogTextBox.InvokeRequired= True Then
    LogTextBox.Invoke(Sub() LogTextBox.AppendText("Check passed"))
Else
    LogTextBox.AppendText("Check passed")
End If

在Visual Basic 2008(9.0)或更低版本中,您必须自行声明委托:

Delegate Sub AddLogText(ByVal Text As String)

IfLogTextBox.InvokeRequired= True Then
    LogTextBox.Invoke(New AddLogText(AddressOf UpdateLog), "Check passed")
Else
    UpdateLog("Check passed")
End If

Sub UpdateLog(ByVal Text As String)
    LogTextBox.AppendText(Text)
End Sub
           

 类似资料:
  • 消费者是一个spring集成项目,它从消息队列中消费并执行大量处理。我使用Executor通道并行处理消息,然后流通过一些公共处理程序类。 请在下面的代码片段中找到- -我们从EMS队列接收消息并将其发送到路由器 -基于以下消息的id:“特定ExecutorChannel实例配置了一个单线程执行器。每个ExecutorChannel都将是它的专用执行器,只有一个线程。 -所有ExecutorCha

  • 虽然我的C程序显然不是线程安全的,但我需要从Java的多线程并行调用它。由于性能问题,我无法重写C代码,需要执行通过并行编译C程序创建的DLL。 如何从Java的多线程调用非线程安全的C函数? 我尝试的是使用JNA并在每次线程调用DLL函数时调用。但是,它并没有解决这个问题,并且出现了分割错误。 我认为DLL的新内存空间是通过调用分配的,应该避免重入问题。但是,我的想法可能是错误的。 我搜索了从J

  • 下面是一个解释线程安全性的示例方法: 为了提供线程安全,有几种方法,我更喜欢使用方法。然而 1.我还想知道是否可以通过对必要的变量使用来提供线程安全。如果是,我如何执行此操作? 2.Java中经常使用作为变量和方法参数来提供线程安全性,这是原因之一吗?

  • 我构建了这个“节流”任务运行器,它在HashMap中收集一些数据,同时(每分钟)将数据“带走”并清除HashMap。在我的测试中,我注意到executor部分可以停止,并且永远不会再次清除HashMap。我假设这是因为我所做的HashMap修改不是线程安全的,它在内部崩溃,没有恢复。我正在两个线程中修改HashMap。有人能告诉我如何优化HashMap修改的正确方向吗。

  • 当使用名为的全局整数作为计数器时,以下代码可以正常工作: 我基本上是使用作为每次调用函数时的递增计数器。计数器第一次执行时会被分配一个起始位置。我之所以使用全局变量,是因为我想确保每次传递的ID都准确增加,而不管执行是否进入递归调用。调用此函数(第一次…)来自分配全局变量起始位置的ForEach循环 我的目标是在初始调用中使用一个并行的。Foreach而不是常规的For per循环。我的问题是处理

  • 例如,我通过 ExecutorService 实例执行可运行块,而该可运行块通过同一 ExecutorService 实例执行一些异步代码。所以我的代码看起来像这样: 这段代码是线程安全的吗,因为ExecutorService没有状态 在我的真实应用程序中,我有一些线程在其中创建了新线程,我想使用一个具有可配置线程池大小的ExecutorService实例(可能是一种不好的做法?)。