使用委托在另一个 Sub 内启动线程

Posted

技术标签:

【中文标题】使用委托在另一个 Sub 内启动线程【英文标题】:Using a delegate for thread start inside another Sub 【发布时间】:2022-01-20 17:49:20 【问题描述】:

我得到的是这样的:

Private Sub GiantLegacySub()

... lots of variables and legacy code...

    Dim somethingNew = New Func(of String, Boolean)(
        Function(stringy as String) As Boolean
            ... new code that uses the legacy variables ...
        End Function)

    Dim t = New Thread(AddressOf somethingNew)

End Sub

我收到一条错误消息,指出somethingNew 被视为变量名而不是方法名,因此AddressOf 无法接受。 (我知道somethingNew 是一个变量,恰好包含一个指向方法的指针)。

有没有办法做到这一点?我需要将它留在GiantLegacySub 内,因为它的范围内变量的剪切量。

【问题讨论】:

AddressOf 用于将例程转换为委托。但是,在这种情况下,您已经有一个委托,因为您将 somethingNew 声明为委托。您应该能够直接提供somethingNew 而无需AddressOf。唯一的问题是确保它与所需的签名匹配——请注意,如果您有Option Strict Off,VB 会尽力提供帮助,并且可以让稍微不匹配的代表排队。 请注意System.ThreadSub 而非Function 作为参数(不带参数,或带单个Object 参数),因此您应该相应地修改您的声明. 【参考方案1】:

根据 Craig 的指导,答案如下:

Private Sub GiantLegacySub()

... lots of variables and legacy code...

    Dim somethingNew = Sub(stringy as String)
            ... new code that uses the legacy variables ...
        End Sub

    Dim t = New Thread(somethingNew)
    t.Start(someStringForStringy)

End Sub

【讨论】:

以上是关于使用委托在另一个 Sub 内启动线程的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 在线程里用textbox,提示 线程间操作无效: 从不是创建控件“TextBox2”的线程访问它

在一个Web服务请求中启动一个线程,并在另一个请求中停止它

使用委托进行跨线程处理的 C# 问题

线程的启动(转)

C#如何在另一个类的线程中对Textbox内容进行修改?

c#winform 多线程绑定datagridview会造成假死,滚动条无法滚动,用委托怎么做