Какой правильный синтаксис для Task.Factory.StartNew? - PullRequest
2 голосов
/ 14 июня 2011

Я пытаюсь создать новый поток в 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 Ответ

3 голосов
/ 14 июня 2011

Нет причин для запуска Задачи, которая ничего не делает, кроме как запускает Поток.Вы должны просто создать задачу напрямую.Вы можете сделать это в 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 # будет:

...