Task.Factory.StartNew的正确语法是什么?

时间:2011-06-13 20:00:09

标签: vb.net syntax-error

我正在尝试在VB.NET中启动一个新线程,并且我遇到了语法问题。

在C#中,我们可以使用以下方式执行相同的任务:

var manualResetEvent = new ManualResetEvent(false);
waitHandles.Add(manualResetEvent);
var taskOne = Task.Factory.StartNew(() => new Thread(TaskToRun).Start(manualResetEvent));
taskOne.Wait();

TaskToRun是一个带有单个对象参数的void方法。

所有在线转换器生成类似于此的VB.NET代码:

Dim manualResetEvent = New ManualResetEvent(False)
waitHandles.Add(manualResetEvent)
Dim taskOne = Task.Factory.StartNew(Function() New Thread(AddressOf TaskToRun).Start(manualResetEvent))
taskOne.Wait()

1 个答案:

答案 0 :(得分:2)

没有理由启动一个除了启动线程之外什么都不做的任务。您应该直接创建任务。您应该可以通过以下方式在VB中执行此操作:

Dim manualResetEvent = New ManualResetEvent(False)
waitHandles.Add(manualResetEvent)
Dim taskOne = Task.Factory.StartNew(Function() TaskToRun(manualResetEvent))

taskOne.Wait() ' Blocks until task is complete

如果要强制任务使用专用线程,可以通过传递LongRunning提示来执行此操作。使用默认的TaskScheduler,这将在专用线程(而不是ThreadPool)上启动任务。


作为参考,等效的C#将是:

var manualResetEvent = new ManualResetEvent(false);
waitHandles.Add(manualResetEvent);
var taskOne = Task.Factory.StartNew(() => TaskToRun(manualResetEvent));

taskOne.Wait();