在VB.NET中创建一个新线程

31

我试图使用匿名函数创建一个新的线程,但是我一直在遇到错误。下面是我的代码:

New Thread(Function() 
    'Do something here
End Function).Start

这里是我遇到的错误:

新的错误:

语法错误

End Function:

'End Function' 必须在匹配的 'Function' 之前。


可能是重复的问题:VB.NET:使用匿名函数创建新线程 - ctacke
3个回答

67
有两种方法可以实现这个:
  1. 使用AddressOf运算符指向一个已有的方法

    Sub MyBackgroundThread()
      Console.WriteLine("Hullo")
    End Sub
    

    然后使用以下代码创建并启动线程:

    Dim thread As New Thread(AddressOf MyBackgroundThread)
    thread.Start()
    
    或者使用 lambda 函数。
    Dim thread as New Thread(
      Sub() 
        Console.WriteLine("Hullo")
      End Sub
    )
    thread.Start()
    

2
谢谢,伙计。这很有帮助。 - Nagendra Upwanshi
它不起作用,我得到了这个错误... System.InvalidOperationException:“跨线程操作无效:从创建它的线程以外的线程访问控件'MapRangeBar1'。”我仍然希望它在后台工作,即懒加载。 - hamish

5

在VB中,它被称为lambda表达式。语法是错误的,您需要实际声明一个Thread类型的变量以使用New运算符。您创建的lambda必须是Thread类构造函数传递的参数的有效替代品。这些都不接受返回值委托,因此必须使用Sub而不是Function。以下是一个随机示例:

Imports System.Threading

Module Module1

    Sub Main()
        Dim t As New Thread(Sub()
                                Console.WriteLine("hello thread")
                            End Sub)
        t.Start()
        t.Join()
        Console.ReadLine()
    End Sub

End Module

我认为值得注意的是,多行lambda表达式只在VS2010中有效。 - J...
1
不是Windows Phone的问题,需要使用VS2010。 - Hans Passant
挑剔的时间到了:Lambda表达式只是一种替代语法,用于编写匿名函数。说Lambda表达式不是匿名函数就像说正方形不是矩形一样。 - Kevin Gosse

3
什么被称为函数而不是子程序。
单行代码(必须返回值):
Dim worker As New Thread(New ThreadStart(Function() 42))

多行文本:

Dim worker As New Thread(New ThreadStart(Function()
                                                     ' Do something here
                                                 End Function))

来源:VB.Net中的线程、闭包和Lambda表达式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接