我在一个ASP.NET控制台应用程序中有8个方法,如Fun1()
,Fun2()
,Fun3()
.等。在我的控制台应用程序中,我顺序调用了所有这些方法。但现在的要求是我必须使用并行编程概念来做到这一点。我读过Java中的任务和线程概念,但对.NET并行编程完全陌生。
下面是我在控制台应用程序中需要的方法流,
的数据
如图所示,Task1
和Task2
应该并行运行,而Task3
只会在前两个完成后才发生。
每个任务中的函数(例如,Task1
的Fun3
和Fun4
)应该依次运行。
有人能帮帮我吗?
2条答案
按热度按时间vu8f3i0k1#
解决这个问题的一种方法是使用WhenAll。
举一个例子,我创建了X个方法,名称为FuncX(),如下所示:
字符串
在本例中,我们有Func1、Func3、Func4、Func5和Func6。
所以我们调用方法并将它们传递给一个Task列表。
型
您有两个选项来获得结果:
型
这只是灵感的例子,你可以改变它,按照你想要的方式去做。
k7fdbhmy2#
下面是如何使用
Task.Run
方法根据图创建任务:字符串
Task.Run
调用ThreadPool
上的委托,而不是专用线程上的委托。如果您有理由为每个任务创建一个专用线程,则可以使用带有TaskCreationOptions.LongRunning
参数的高级Task.Factory.StartNew
方法,如下所示。应该注意的是,上述实现在出现异常的情况下并没有最佳行为。如果
Fun3()
立即失败,最佳行为将是尽快停止task2
的执行。相反,此实现将执行所有三个函数Fun1
。您可以通过创建一个CancellationTokenSource
并在每个函数后调用Token.ThrowIfCancellationRequested
来修复这个小缺陷,但这会很麻烦。另一个问题是,如果
task1
和task2
都发生故障,则只有task1
的异常会通过task3
传播。解决此问题并非易事。**更新:**以下是解决部分异常传播问题的一种方法:
型
如果
task1
和task2
都失败,task3
将传播这两个任务的异常。