Каков правильный синтаксис для Task.Factory.StartNew?

#vb.net #syntax-error

#vb.net #синтаксическая ошибка

Вопрос:

Я пытаюсь запустить новый поток в 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. Зачем создавать задачу, которая запускает поток?

Ответ №1:

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


Для справки, эквивалентный C # будет:

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

taskOne.Wait();
  

Комментарии:

1. Целью было создать несколько потоков и использовать список waithandler для получения уведомлений, когда все потоки завершат выполнение переменной waitTask = Task. Factory.StartNew(() => Ожидание обработки. WaitAll (ожидание обработки. toArray())); ожидание задачи. Wait();

2. @Sammy: Если это так, просто создайте несколько задач , а затем вызовите Task. WaitAll (задачи). Нет необходимости в дескрипторах ожидания и созданных вручную потоках.