在WCF方法中使用Task.WaitAll

尼尔

我有一个.NET 4.5.1 WCF服务,该服务处理来自将由成千上万个用户使用的应用程序的同步。我目前使用Task.WaitAll,如下所示,并且工作正常,但我读到这很糟糕,可能导致死锁等。我相信我过去曾尝试过WhenAll,但没有成功,我不记得这些问题了。我将再次返回此评论,以确保我做对了。我担心的是在此使用中是否需要阻塞并且它是首选阻塞,这是WCF服务方法,因此,为什么WaitAll似乎可以正常工作。

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

这是正确的方法吗?我想确保此方法可以很好地扩展,不会引起问题,并且可以在WCF服务方案中正常工作。

usr

在大规模服务中,通常最好使用异步IO(不是,而是使用Task.Run)。“高等级”的定义非常宽松。服务器上的异步IO的好处是它不会阻塞线程。这导致更少的内存使用和更少的上下文切换。这就是全部。

如果您不需要这些好处,则可以使用同步IO并阻止所有需要的操作。不会有坏事发生。可以理解,在后台线程上运行10个查询并等待它们会暂时阻止11个线程。根据您期望的并发操作数,这可能很好,也可能不好。

我建议您对异步IO的可伸缩性优势进行一些研究,以便更好地了解何时使用它。请记住,进行异步操作需要付出一定的代价:开发速度较慢,并发错误更多。

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

我经常发现的是:如果需要询问,则不需要它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Task.WaitAll()的默认超时

来自分类Dev

Task.WaitAll is not waiting - Explanation

来自分类Dev

使用Task.WaitAll()处理等待的任务?

来自分类Dev

Task.WaitAll()无法正常工作

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

C#Task.WaitAll不在等待

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

Task.WaitAll没有在等待-解释

来自分类Dev

Task.WaitAll无限期阻止

来自分类Dev

在WaitAll中运行几种方法

来自分类Dev

使用任务和WaitAll进行递归

来自分类Dev

使用任务和WaitAll进行递归

来自分类Dev

“ foreach with task.Wait”和Task.WaitAll之间的区别

来自分类Dev

“ foreach with task.Wait”和Task.WaitAll之间的区别

来自分类Dev

Why does Task.WaitAll() not block or cause a deadlock here?

来自分类Dev

C#中的Task.WaitAll挂起了任务的执行

来自分类Dev

C#中的Task.WaitAll挂起了任务的执行

来自分类Dev

如果发生任何异常,如何使Task.WaitAll()中断?

来自分类Dev

C#Task.WaitAll()取消,进行错误处理

来自分类Dev

Task.WaitAll方法(Task [],Int32)在线程过期时不会释放该线程

来自分类Dev

Task.WaitAll方法(Task [],Int32)在线程过期时不会释放该线程

来自分类Dev

使用Task.Start触发任务时卡在Task.WaitAll(tasks.ToArray())

来自分类Dev

使用Task.WaitAll(threads)没有适当地阻止

来自分类Dev

即使调用Task.WaitAll(task),也不会阻止异步上传到Azure

来自分类Dev

Parallel.ForEach(task.Wait)和Task.WaitAll之间的区别

来自分类Dev

为什么Task.WaitAll()在这里不会阻止或导致死锁?

来自分类Dev

C#Task.WaitAll()如何将对象状态组合为一个?

来自分类Dev

处理Task.WaitAll中已取消的任务和任务异常?

来自分类Dev

如何从控制台应用程序中的Task.WaitAll()获得返回值?

Related 相关文章

  1. 1

    Task.WaitAll()的默认超时

  2. 2

    Task.WaitAll is not waiting - Explanation

  3. 3

    使用Task.WaitAll()处理等待的任务?

  4. 4

    Task.WaitAll()无法正常工作

  5. 5

    任务等待vs Task.WaitAll

  6. 6

    C#Task.WaitAll不在等待

  7. 7

    任务等待vs Task.WaitAll

  8. 8

    Task.WaitAll没有在等待-解释

  9. 9

    Task.WaitAll无限期阻止

  10. 10

    在WaitAll中运行几种方法

  11. 11

    使用任务和WaitAll进行递归

  12. 12

    使用任务和WaitAll进行递归

  13. 13

    “ foreach with task.Wait”和Task.WaitAll之间的区别

  14. 14

    “ foreach with task.Wait”和Task.WaitAll之间的区别

  15. 15

    Why does Task.WaitAll() not block or cause a deadlock here?

  16. 16

    C#中的Task.WaitAll挂起了任务的执行

  17. 17

    C#中的Task.WaitAll挂起了任务的执行

  18. 18

    如果发生任何异常,如何使Task.WaitAll()中断?

  19. 19

    C#Task.WaitAll()取消,进行错误处理

  20. 20

    Task.WaitAll方法(Task [],Int32)在线程过期时不会释放该线程

  21. 21

    Task.WaitAll方法(Task [],Int32)在线程过期时不会释放该线程

  22. 22

    使用Task.Start触发任务时卡在Task.WaitAll(tasks.ToArray())

  23. 23

    使用Task.WaitAll(threads)没有适当地阻止

  24. 24

    即使调用Task.WaitAll(task),也不会阻止异步上传到Azure

  25. 25

    Parallel.ForEach(task.Wait)和Task.WaitAll之间的区别

  26. 26

    为什么Task.WaitAll()在这里不会阻止或导致死锁?

  27. 27

    C#Task.WaitAll()如何将对象状态组合为一个?

  28. 28

    处理Task.WaitAll中已取消的任务和任务异常?

  29. 29

    如何从控制台应用程序中的Task.WaitAll()获得返回值?

热门标签

归档