2011-06-13 75 views
1

我想在VB.NET中启动一个新线程,并且出现语法问题。Task.Factory.StartNew的正确语法是什么?

在C#这是怎么了,我们可以用做同样的任务:

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

TaskToRun是一个无效的方法与单个对象的参数。

所有在线转换器生成类似于此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

为什么要创建一个启动一个线程任务? – 2011-06-13 20:08:22

回答

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)上启动任务。


作为参考,equivelent C#是:

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

taskOne.Wait(); 
+0

目的是创建多个线程并使用等待处理程序列表在所有线程完成运行时都可以通知 var waitTask = Task.Factory.StartNew(()=> WaitHandle.WaitAll(waitHandles.ToArray())); waitTask.Wait(); – Sammy 2011-06-13 20:14:59

+0

@Sammy:如果是这种情况,只需创建多个* Tasks *,然后调用Task.WaitAll(任务)。不需要等待句柄和手动创建的线程。 – 2011-06-13 20:16:13