Vb.net 调用时的线程检查

Vb.net 调用时的线程检查,vb.net,multithreading,forms,invoke,Vb.net,Multithreading,Forms,Invoke,因此,我最初有这段代码,其中调用程序树中的父调用程序是我的主窗口的加载函数。现在,每当我重新启动操作系统时,这会给我一个beginInvoke(您的windows控件尚未初始化,它会尝试引用它)错误。许多人建议将其移动到表单显示事件,如果加载了某个内容,则添加一个布尔值,但这并没有解决问题。最后我只是删除了多线程,因为我正在拔头发 'send broadcast on network Dim tasksArr(1) As Task Dim brand1Searc

因此,我最初有这段代码,其中调用程序树中的父调用程序是我的主窗口的加载函数。现在,每当我重新启动操作系统时,这会给我一个beginInvoke(您的windows控件尚未初始化,它会尝试引用它)错误。许多人建议将其移动到表单显示事件,如果加载了某个内容,则添加一个布尔值,但这并没有解决问题。最后我只是删除了多线程,因为我正在拔头发

     'send broadcast on network    
    Dim tasksArr(1) As Task
    Dim brand1SearchTask= Task(Of List(Of device)).Factory.StartNew(Function() getbrand1())
    Dim brand2SearchTask= Task(Of List(Of device)).Factory.StartNew(Function() getbrand2())

    Try
        tasksArr(0) = brand1SearchTask
        tasksArr(1) = brand2SearchTask
        Task.WaitAll(tasksArr)
    Catch ex As Exception

    End Try

    Try
        Try
            deviceList.AddRange(brand1SearchTask.Result())
        Catch ex As Exception
        End Try

        deviceList.AddRange(brand2SearchTask.Result())
    Catch ex As Exception

    End Try
此代码位于名为NetworkSearch.FindDevices()的单独类中的函数中。它是从主窗口的load函数调用的

所以从我所了解到的主要问题是,在tasks'.start或begin中,调用它calls.Invoke,如果我的表单当时没有初始化,它将从windows发出抱怨。我的一个解决方案是创建一个单独的模块,然后为我的主窗口创建一个新的()形式。这消除了错误,但该窗口中的任何其他表单(如单击按钮启动另一个表单)也没有初始化,并给了我一个null异常

我的问题:检查我是否已在任务或线程环境中初始化,然后等待进入线程的好方法是什么?如果这是一个控件,我会创建一个委托函数并对其进行编辑,但这里并没有直接涉及GUI

我尝试过的:

-创建一个模块并从中生成一个新的()主窗体,但从那里启动时,我的其他窗体都不是对象

-已移到显示的main表单中(仍发生begin invoke错误)

-添加了一个私有子My_应用程序启动来处理My.startup和My.Settings.Loadfinished布尔值,但未将其删除


-添加了一个“mainwindow.invokerequired”检查,仅在运行时抱怨它需要说“me”

如果您想设计一个类,使其能够在不直接了解UI的情况下在UI线程上执行特定的代码,那么您有两个主要选项:

  • 在类型为
    ISynchronizeInvoke
    的类中声明一个
    synchroningobject
    属性。在内部,测试该属性是否为
    Nothing
    ,如果不是,则使用其
    invokererequired
    属性和
    Invoke
    /
    BeginInvoke
    方法。从外部,可以将窗体或其他控件指定给该属性。这就是
    FileSystemWatcher
    Timer.Timer
    类的工作方式

  • 在类中声明类型为
    SynchronizationContext
    的字段,并使用
    SynchronizationContext.Current
    对其进行初始化。如果您的类在UI线程上实例化,那么该字段将不会是
    Nothing
    ,您可以使用其
    Send
    /
    Post
    方法