2011-06-13 92 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