`
helloyesyes
  • 浏览: 1303993 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

.net编程时在线程里使用Form上的控件的问题

阅读更多

在写VB.net时,遇到要在线程里改变Form上的ListView控件中的信息,动手做起来才发现并不是那么容易。因为微软的框架并不鼓励在线程里直接访问Form上的控件。因为这样会改变UI进程的正常执行。如果必须这样做,需要在线程中使用Invoke函数或者InvokeBegin函数。下面是一个例子:

Imports System.Threading

Public Class Form1
Delegate Sub AddListItem(ByVal IPString As String, ByVal ScanPort As Integer)
Public myDelegate As AddListItem
Public OpenPortCount As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myDelegate = New AddListItem(AddressOf AddListItemMethod)
End Sub

Private Sub Start_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Start_Button.Click
Dim mythread As Thread
mythread = New Thread(New ThreadStart(AddressOf ThreadFunction))
mythread.Start()

End Sub

Private Sub ThreadFunction()
Dim mythread As Thread
mythread = New Thread(New ThreadStart(AddressOf DoScanThread))
mythread.Start()
End Sub 'ThreadFunction

Private Sub DoScanThread()
Dim myThreadClassObject As New ScanThreadClass(Me)
myThreadClassObject.run()
End Sub


Public Sub AddListItemMethod(ByVal IPString As String, ByVal scanport As Integer)
ListView_Result.Items.Add(IPString, OpenPortCount) 'ScanIP.ToString(), 0)
ListView_Result.Items(OpenPortCount).SubItems.Add(scanport.ToString())
OpenPortCount += 1
End Sub 'AddListItemMethod

End Class

Public Class ScanThreadClass
Private myFormControl1 As Form1

Public Sub New(ByVal myForm As Form1)
myFormControl1 = myForm
End Sub 'New


Public Sub run()
myFormControl1.Invoke(myFormControl1.myDelegate, New Object() {"11", 123})
End Sub

End Class

主要注意的就是Invoke的调用和Delegate的定义。

分享到:
评论

相关推荐

    c#在多线程中访问Form中控件的多种解决方案

    然而,在多线程环境中访问 UI 控件(如 `TextBox`)时,会遇到一个常见的问题:跨线程访问异常。由于 .NET Framework 的安全性设计,默认情况下不允许从创建控件之外的线程访问控件。这种限制有助于避免潜在的线程...

    VB.NET编程实例教程.ZIP

    《VB.NET编程实例教程》是一本深入探讨VB.NET编程技术的教程,涵盖了广泛的主题,旨在帮助初学者和有经验的开发者提升在.NET平台上的技能。该教程通过丰富的实例,讲解了VB.NET的核心概念和实际应用。 首先,让我们...

    VB.NET编程实例教程源代码

    VB.NET编程实例教程源代码是针对初学者和进阶开发者提供的宝贵学习资源,涵盖了多个关键领域,帮助读者深入理解.NET框架下的VB.NET编程。通过这些源代码实例,我们可以学习到以下核心知识点: 1. **.NET应用程序...

    VBnet 分线程窗体,主线程卡死任然报告方法的进度值到UI窗体上面

    在VB.NET编程中,我们经常会遇到需要执行耗时任务的情况,这些任务可能会导致应用程序的主线程(UI线程)被阻塞,进而使用户界面变得无响应。标题和描述所提及的问题是关于如何在分线程中执行任务,并在主线程卡死时...

    Visual C#.NET编程精粹150例.rar

    第1章 C#编程基础  实例1 Hello C#!  实例2 HeyGuy  实例3 预定义类型  实例4 类型转换  实例5 选择语句  实例6 循环语句  实例7 跳转语句  实例8 数组  实例9 枚举与结构类型  实例10 类  ...

    VB.NET编程实例教程

    《VB.NET编程实例教程》是一本深入浅出的编程指南,专为想要学习或提升VB.NET编程技能的读者设计。本书共分为17个章节,涵盖了VB.NET在多个关键领域的应用,包括ADO.NET、Web Form、XML以及Windows Service,同时对...

    VB.NET编程实例 爱情许愿树

    《VB.NET编程实例:爱情许愿树》是一个深入学习VB.NET编程语言的实践项目,它以一个具有浪漫色彩的应用程序为例,帮助开发者掌握VB.NET的基本语法、控件使用以及事件处理等核心技能。在这个实例中,我们将探讨如何...

    VisualBasic.NET编程基础

    本教程将深入探讨VB.NET编程的基础知识,帮助你掌握这一强大的开发工具。 一、VB.NET简介 VB.NET是在Visual Basic 6.0的基础上发展而来的,它完全兼容.NET Framework,支持.NET的所有特性和服务。VB.NET引入了类型...

    VB.net编程基础

    以上只是VB.NET编程基础的一部分,深入学习还包括XML处理、网络编程、多线程等高级主题。通过不断的实践和学习,初学者可以逐步成长为熟练的VB.NET开发者。在“VisualBasic_NET编程基础”这个教程中,你会找到更多...

    vb.net编程实例

    在VB101SamplesBCL这个压缩包中,我们可以期待找到与基础类库(BCL,Base Class Library)相关的VB.NET编程实践。 VB.NET是微软.NET框架的一部分,是一种面向对象的编程语言,它的语法简洁且易于理解。在VB.NET中,...

    C#.NET编程培训教程-书附光盘资料

    C#.NET编程是一种基于.NET Framework的编程语言,它在软件开发领域中占据着重要的地位,尤其在企业级应用开发上。本教程旨在提供一个全面的C#.NET编程学习路径,帮助初学者和有一定基础的开发者深入理解并掌握C#.NET...

    中奖程序,form编程,多线程操作

    现代编程实践中更推荐使用`CancellationToken`或其他机制来安全地暂停和恢复线程。 - `thread.Resume();`:恢复已挂起的线程。同样地,`Resume`方法也被废弃。 - `thread.Abort();`:强制关闭线程。这种方法同样不...

    从线程操作主窗体控件

    在编程中,特别是Windows应用程序开发,我们经常遇到多线程环境下的UI操作问题。标题"从线程操作主窗体控件"所涉及的核心知识点是线程同步与UI线程安全。描述中提到的错误“线程间操作无效 从不是创建控件“___”的...

    VB http多线程下载源码不用Active控件

    标题中的“VB http多线程下载源码不用Active控件”指的是使用Visual Basic(VB)编程语言编写的一个HTTP下载程序,该程序支持多线程下载,且不依赖于ActiveX控件。在VB中,多线程技术可以提高程序的执行效率,特别是...

    C#跨线程访问控件

    在C#编程中,跨线程访问控件是一个常见的需求,特别是在UI(用户界面)更新和后台任务执行之间需要协调时。线程池和Action委托以及Control类的Invoke方法是解决这一问题的关键技术。让我们深入探讨一下这些概念及其...

    C# Winform线程创建子窗体

    在C# Winform开发中,多线程技术是不可或缺的一部分,尤其当涉及到用户界面(UI)的异步操作时。线程允许程序同时执行多个任务,提高应用的响应性和效率。本话题将深入探讨如何利用线程来延迟创建子窗体,并且如何安全...

    后台控件完成线程功能

    后台控件,通常在VB.NET等.NET框架中被称为“BackgroundWorker”组件,是一种设计用于在非UI线程上执行耗时操作的工具。这使得主UI线程能够保持对用户界面的响应,避免出现“冻结”现象。当后台任务完成时,它会通知...

    跨线程访问Windows窗体控件

    在Windows应用程序开发中,尤其是使用.NET Framework的Windows Forms平台,我们经常会遇到跨线程访问窗体控件的问题。这是因为Windows Forms控件默认是线程安全的,只能由创建它们的线程进行修改。如果尝试从其他...

    【ASP.NET编程知识】.NET资源泄露与处理方案知识点分享.docx

    【ASP.NET编程知识】.NET资源泄露与处理方案 在.NET框架中,虽然垃圾回收(Garbage Collection,简称GC)机制能自动管理大部分内存,但开发者仍需关注资源管理,尤其是非托管资源,以防止资源泄露。资源泄露可能...

    vb.net编码解码例子form

    在VB.NET编程中,字符编码和解码是一个重要的概念,特别是在处理不同语言和文本格式时。这个"vb.net编码解码例子form"是用于演示如何在VB.NET环境中进行字符集转换的一个实例。以下是对该标题和描述中所涉及知识点的...

Global site tag (gtag.js) - Google Analytics