【问题标题】:What is the correct syntax for Task.Factory.StartNew?Task.Factory.StartNew 的正确语法是什么?
【发布时间】:2011-06-13 20:00:08
【问题描述】:

我正在尝试在 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()

【问题讨论】:

  • 为什么要创建一个启动线程的任务?

标签: vb.net syntax-error


【解决方案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 提示来实现。使用默认的 TaskScheduler,这将在专用线程(而不是 ThreadPool)上启动任务。


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

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

taskOne.Wait();

【讨论】:

  • 目的是创建多个线程并使用waithandler列表在所有线程完成运行时得到通知 var waitTask = Task.Factory.StartNew(() => WaitHandle.WaitAll(waitHandles.ToArray( ))); waitTask.Wait();
  • @Sammy:如果是这样,只需创建多个Tasks,然后调用Task.WaitAll(tasks)。无需等待句柄和手动创建的线程。
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 2018-11-14
  • 2019-09-07
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2018-11-22
相关资源
最近更新 更多