如何顺序执行异步操作?

9
现在我正在使用类似于这种结构的东西。
A.Completed += () =>
{ B.Completed += () =>
  {  C.Completed += () =>
     {
       //
     }
     C();
   }
   B();
 }  
 A();

我对此不太满意。有没有更好、更干净的方法来执行这种顺序/并发操作?

我看了一下Rx框架,但它是为其他任务设计的,看起来对我的问题来说过于复杂。


1
你也可以查看SignalR源代码,了解Then、Catch等流畅使用的内容。 - Mert Susur
5个回答

8

除非有人在A完成之前调用B或C,否则不需要嵌套设置已完成的事件。如果将其分开,它看起来像这样:

A.Completed += () => { B(); };
B.Completed += () => { C(); };  
C.Completed += () => { //   }; 

A();

我认为去掉嵌套可以使代码更加清晰易懂。


4

2

您可以查看TPL。您可以按照此线程中的代码编写:链接


1

虽然不是非常干净,但您可以看一下BackgroundWorker

BackgroundWorker A = new BackgroundWorker();
A.DoWork += (s, e) => AMethod();
A.RunWorkerCompleted += (s, e) => BMethod();

BackgroundWorker B = new BackgroundWorker();
B.RunWorkerCompleted += (s, e) => CMethod();

//etc

你并没有真正减少太多代码,但我认为它更加简洁了。


非常小心。我通常建议避免使用线程来处理异步程序流程。有比线程更好的结构来组织代码。在代码可读性和执行复杂性方面,可能不值得这样做。 - Jordan Parmer
1
你推荐哪些编程结构? - Adam Rackis

1

等待C# 5.0并使用新的asyncawait关键字。

以下是一些关于此的初步链接:

  • {{link1:“简化异步-我们等待的内容”,Reed Copsey,Jr.}}

  • {{link2:“C# Async”,csharphelp.com}}

  • {{link3:“对C# 5的异步支持的初步想法”,John Skeet}}


具有相同的填充。任何当前语言可能性的实现都会使代码变得晦涩难懂。希望C# 5能够尽快发布。 - v00d00
1
与此同时,这不是一个严肃的答案。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接