C#async / await。打电话给忘记,没有等待。而且运行时间长

时间:2016-10-07 18:51:39

标签: c# asynchronous async-await

我正在尝试利用新的(相对)C#async / await基于任务的功能。我经历了几个例子,我对优势有了全面的了解。 以下是两个主题,如果有人与我/我们分享一些线索或代码,我将非常感激:

  1. 我用来在"过程中写一些记录/跟踪信息"几十次(比如写入TXT文件日志或将一些状态转储到db等)我觉得异步执行这些调用非常有效(调用和遗忘,无需等待)。但我学到的是每个异步任务都有等待,真正异步。 那么,在" main方法/功能"中,多次调用相同的方法(具有不同的参数值,如消息...)的解决方案是什么?并且不要等待每次通话,等待"?

  2. 我有一个非常复杂的[processA()](class.method),它在" main"的循环中被调用。 Windows服务中的类来处理"下一个文档" (数千次)(长时间运行的过程)。我想把这个[processA()]放在一个Task中,并且并行使用4-8个任务来调用[processA()]。

  3. 任何线索,有用的链接或代码示例都将得到真正的赞赏。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

  

我觉得异步执行这些调用非常有效(呼叫和忘记,不等待)。

火灾和忘记的问题是您不知道操作是否失败。对于大多数代码而言,这是不可接受的。

许多日志记录框架同步写入内存存储,然后定期刷新到磁盘/数据库。这样可以在速度和日志可靠性之间进行良好的权衡。

  

我想把这个[processA()]放在一个Task中并且并行使用4-8个任务来调用[processA()]。

听起来你混淆了并行处理的异步性。如果你想使用并行处理,那么使用Parallel.ForEach或类似的东西;如果要使用异步,则第一步是使processA异步,然后使用await Task.WhenAll完成所有任务。