0

在我的应用程序中,我向 List(Of Task) 添加了一堆操作,如下所示:

Dim Tasks As New List(Of Task)

Tasks.Add(Task.Factory.StartNew(Sub()
                                    System.Threading.Thread.Sleep(3000)
                                End Sub))

Tasks.Add(Task.Factory.StartNew(Sub()
                                    System.Threading.Thread.Sleep(3000)
                                End Sub))

Task.WaitAll(Tasks.ToArray())

当我调用时Task.WaitAll(Tasks.ToArray()),它会按预期同时执行所有任务。但是,调试/单步执行线程方法有点困难,所以我希望能够同步执行所有这些(我会在我的配置文件中创建一个 AppSetting 来确定是否同步或异步运行任务)。但是,调用.RunSynchronously()使用创建的任务会.StartNew()引发异常。

我应该如何构建这个任务列表,以便在同步和异步执行之间切换?

编辑: 从概念上讲,这是我想做的:

If ConfigurationManager.AppSettings("ExecuteAsynchronously") = "1" Then
    Task.WaitAll(Tasks.ToArray())
Else
    Task.WaitAllAsynchronously(Tasks.ToArray())
End If

我知道这.WaitAllAsynchronously()不存在,但你仍然可以看到我想要实现的最终结果。如果我必须创建一个名为.WaitAllAsynchronously()迭代每个任务并同步执行它的扩展方法,那么这就是我要做的。

由于.StartNew()不支持同步执行,我需要构建我的任务列表而不实际启动它们,但是以一种同时支持同步和异步执行的方式。

4

2 回答 2

0

您可以使用Parallel.Invoke并将其设置为使用单个线程。

Dim po AS new ParallelOptions()
po.MaxDegreeOfParallelism = 1

Parallel.Invoke(po,
                Sub()
                   System.Threading.Thread.Sleep(3000)
                End Sub,
                Sub()
                   System.Threading.Thread.Sleep(3000)
                End Sub
                )
于 2012-08-15T14:06:58.070 回答
0

我想出了一种使用 Tasks 做我想做的事情的方法。我打算删除我的问题,但我觉得其他人可能会从中受益,所以这就是我所做的:

Dim ExecuteSynchonously As Boolean = True

Dim Tasks As New List(Of Task)

Tasks.Add(New Task(Sub()
                       System.Threading.Thread.Sleep(3000)
                   End Sub))

Tasks.Add(New Task(Sub()
                       System.Threading.Thread.Sleep(3000)
                   End Sub))

'will create helper extension methods for these
If ExecuteSynchonously Then
    Tasks.ForEach(Sub(t)
                      t.RunSynchronously()
                  End Sub)
Else
    Tasks.ForEach(Sub(t)
                      t.Start()
                  End Sub)
    Task.WaitAll(Tasks.ToArray)
End If

首先,我通过将未启动的任务添加到集合中来构建集合(而不是.StartNew())。你可以关注其余的。我最终会为这些创建辅助方法,但这至少显示了我使用的核心代码。

如果有人看到更有效的方法来做到这一点,请告诉我。

于 2012-08-15T14:47:02.073 回答