【问题标题】:How to execute async operations sequentially?如何按顺序执行异步操作?
【发布时间】:2011-02-15 23:25:33
【问题描述】:

现在我正在使用与此结构类似的东西

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

对它不是很满意。有没有更好、更简洁的方式来执行这种顺序/并发操作?

我查看了 Rx 框架,但它是为其他任务设计的,看起来对我的问题来说有点矫枉过正。

【问题讨论】:

  • 您还可以查看 signalR 源代码,了解诸如 Then, Catch fluent use 之类的内容。

标签: c# silverlight


【解决方案1】:

没有必要嵌套设置 Completed 事件,除非有人可能在 A 完成之前实际调用 B 或 C。如果你把它分开,它是这样的:

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

A();

我认为去除嵌套实际上使它更干净。

【讨论】:

    【解决方案2】:

    看看ReactiveUI。它基于 Rx,将大大简化您的代码。这是一个例子:Calling Web Services in Silverlight using ReactiveXaml

    【讨论】:

      【解决方案3】:

      你可以看看 TPL。您可以在此线程中编写代码:link

      【讨论】:

        【解决方案4】:

        它不是更干净,但你可以看看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
        

        您并没有真正减少太多代码,但我想说它更简洁。

        【讨论】:

        • 对此要非常小心。我通常建议避免使用线程来处理异步程序流。有比线程更好的结构来组织代码。代码可读性和执行的复杂性我不值得。
        • 您推荐哪些结构??
        【解决方案5】:

        【讨论】:

        • 有相同的填充。任何具有当前语言可能性的实现都会使代码变得模糊。希望 C# 5 早日发布。
        • 同时,这不是一个严肃的答案。
        猜你喜欢
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多