Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Task.Factory.StartNew的正确语法是什么?_Vb.net_Syntax Error - Fatal编程技术网

Vb.net Task.Factory.StartNew的正确语法是什么?

Vb.net Task.Factory.StartNew的正确语法是什么?,vb.net,syntax-error,Vb.net,Syntax Error,我试图在VB.NET中启动一个新线程,但遇到语法问题 在C#中,我们可以使用以下方法完成相同的任务: var manualResetEvent = new ManualResetEvent(false); waitHandles.Add(manualResetEvent); var taskOne = Task.Factory.StartNew(() => new Thread(TaskToRun).Start(manualResetEvent)); taskOne.Wait(); Ta

我试图在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中执行此操作:

Dim manualResetEvent = New ManualResetEvent(False)
waitHandles.Add(manualResetEvent)
Dim taskOne = Task.Factory.StartNew(Function() TaskToRun(manualResetEvent))

taskOne.Wait() ' Blocks until task is complete
如果要强制任务使用专用线程,可以通过传递提示来实现。使用默认TaskScheduler,这将在专用线程(而不是线程池)上启动任务


作为参考,等效C#为:

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

taskOne.Wait();

为什么要创建一个启动线程的任务?其目的是创建多个线程,并在所有线程都已完成运行var waitTask=Task.Factory.StartNew(()=>WaitHandle.WaitAll(waitHandles.ToArray())时使用要通知的waithandler列表;waitTask.Wait()@萨米:如果是这样,只需创建多个任务,然后调用Task.WaitAll(任务)。不需要等待句柄和手动创建的线程。