C# 在WCF方法中使用Task.WaitAll

C# 在WCF方法中使用Task.WaitAll,c#,wcf,parallel-processing,task-parallel-library,async-await,C#,Wcf,Parallel Processing,Task Parallel Library,Async Await,我有一个.NET 4.5.1 WCF服务,它处理来自一个应用程序的同步,该应用程序将被成千上万的用户使用。我目前使用Task.WaitAll,如下所示,它运行良好,但我读到这是不好的,可能会导致死锁等。我相信我在过去尝试过,但它不起作用,我不记得这些问题,因为我再次回到这里进行审查,只是为了确保我做得正确。我关心的是,在这种使用中,阻塞是否是必需的,并且是首选的,这是一种WCF服务方法,因此WaitAll似乎可以正常工作 我有十几种方法,每种方法都会更新EntityFramework6中的一个实

我有一个.NET 4.5.1 WCF服务,它处理来自一个应用程序的同步,该应用程序将被成千上万的用户使用。我目前使用Task.WaitAll,如下所示,它运行良好,但我读到这是不好的,可能会导致死锁等。我相信我在过去尝试过,但它不起作用,我不记得这些问题,因为我再次回到这里进行审查,只是为了确保我做得正确。我关心的是,在这种使用中,阻塞是否是必需的,并且是首选的,这是一种WCF服务方法,因此WaitAll似乎可以正常工作

我有十几种方法,每种方法都会更新EntityFramework6中的一个实体,用现有数据处理传入数据并进行必要的更改。这些方法中的每一种都很昂贵,所以我想主要使用并行性来让所有方法在这个强大的24核服务器上同时工作。每个方法都以Task的形式返回,并将其内容包装在Task.Run中。DoSync方法创建了一个新列表,并将这些同步方法中的每一个添加到列表中。然后我调用Task.WaitAll(taskList.ToArray()),所有这些都非常有效


这样做对吗?我希望确保此方法能够很好地扩展,不会导致问题,并且在WCF服务场景中正常工作。

在高规模服务中,使用异步IO通常是一个好主意(您不使用异步IO-您使用
任务。运行
)。“高规模”的定义非常松散。服务器上异步IO的好处是它不会阻塞线程。这导致更少的内存使用和更少的上下文切换。这就是全部

如果你不需要这些好处,你可以使用同步IO和阻塞所有你喜欢的。不会有坏事发生。请理解,在后台线程上运行10个查询并等待它们将暂时阻止11个线程。这可能是好的,也可能不是,这取决于您期望的并发操作的数量

我建议您研究一下异步IO的可伸缩性优势,以便更好地了解何时使用它。请记住,异步是有代价的:开发速度较慢,并发错误较多

请理解,异步IO不同于仅使用线程池(
Task.Run
)。线程池不是无线程的,而异步IO根本不使用任何线程。甚至不是运行时管理的“不可见”线程


我经常发现:如果你不得不问,你不需要它。

任务。当所有的
都是任务的非阻塞等价物时。WaitAll
,如果没有看到你的代码,我想不出任何理由为什么它不起作用,也不可取。但是请注意,
Task.whalll
本身返回一个
Task
,您必须
wait
。您这样做了吗?

但是您必须在WCF方法中进行阻止吗?服务上下文与Http上下文?不确定,我应该再试一次,但想看看大家对WCF使用的看法。ThxNo。在
await
之后,
OperationContext
中似乎存在一个为空的with
wait
,但是如果您需要它,我会按照该链接中的简单建议手动捕获它。比阻塞所有这些线程要好得多。我知道这个问题很老了,但在WCF服务中几乎没有理由使用异步。对于并行性,您可以在其他情况下轻松使用
Parallel.For/Foreach
或PLINQ
.aspallel()