2010-05-07 40 views
1

說我有4類訂購的在c#異步方法的調用

  • ControllerClass
  • MethodClass1
  • MethodClass2
  • MethodClass3

並且每個MethodClass具有異步方法DoStuff( )並且每個都有一個CompletedEvent。

ControllerClass負責以特定順序在3個方法類別上調用3個異步方法。

因此,ControllerClass調用MethodClass1.DoStuff()並訂閱MethodClass1.CompletedEvent。當該事件被觸發時,ControllerClass調用MethodClass2.DoStuff()並訂閱MethodClass2.CompletedEvent。當該事件被觸發時,ControllerClass調用MethodClass3.DoStuff()

對於這種情況是否有最佳做法?這是不好的設計?

我相信這是因爲

  • 我很難發現它的單元測試(一個明確的信號)
  • 這是不容易改變的順序
  • 我有一種不安,代碼異味感覺它

在這種情況下有什麼替代方案?

注意:我針對.NET 2.0框架

回答

1

Jeff Richter有一篇關於使用枚舉器簡化APM代碼的優秀文章。微軟CCR也使用了類似的技術。值得探討:

http://msdn.microsoft.com/en-us/magazine/cc546608.aspx

+0

他的AsyncEnumerator是Microsoft CCR的一個簡單版本,取代了Task Parallel Library:http://msdn.microsoft.com/en-us/library/dd460717.aspx – Oliver 2010-05-07 09:32:38

+0

感謝您的鏈接,我會檢查出來。我應該說我的目標是.NET 2.0。我會更新我原來的問題。 – 2010-05-07 09:57:46

+0

@Oliver:就我所知,任務並行庫不會取代ccr,它可以並排使用,並且它們具有不同的特徵。 Ccr是輕量級的異步處理和消息傳遞,tpl是更重型的癱瘓大算法。 – Toad 2010-06-05 14:56:59

0

我們使用的是什麼版本的.NET?在.NET 4.0中有Task類,你可以用它來激發任務,並且很容易改變順序。

一個很好的例子是在這裏:http://blogs.msdn.com/pfxteam/

你可以看到你是如何排隊任務。

+0

這屬於任務並行庫:http://msdn.microsoft.com/en-us/library/dd460717.aspx – Oliver 2010-05-07 09:33:20

+0

@Oliver:PFX是.NET 4.0的一部分:) – Snake 2010-05-07 09:34:36

+0

不幸的是它是.NET 2.0在這種情況下... – 2010-05-07 09:55:22

0

由於您使用所需要的三種方法以特定的順序運行,他們需要等待對方,你爲什麼要費心異步調用呢?只需進行簡單的同步呼叫。

+0

這些方法本身開始異步工作,以便它們立即返回給調用者。瞭解一些有趣的事情的唯一方法就是訂閱Completed事件。 – 2010-05-07 09:56:54

+0

也許代碼是高度併發的(在服務器上?),在這種情況下阻塞線程任何時間都是不明智的,因爲它需要許多線程無所事事。根據我的經驗,在這種情況下不使用APM是一種殺死服務器性能的好方法。 – spender 2010-05-07 09:56:55

1

如果您有權訪問您正在調用的類的代碼,並且可以自由更改它,爲什麼不把它包裝在處理程序中(實現責任鏈模式)。然後您可以爲每種方法定義後繼者。這將保持較低的靈活性和較低的複雜性。

+0

實際上這很有趣。我喜歡能夠在這種模式中設置繼任者。無論如何,+1。 – 2010-05-07 11:26:10

1

這樣做沒有意義。異步調用一個輔助方法。它應該調用你現在異步運行的三種方法。排序他們現在很簡單,你只有一個異步方法擔心。更高效的是,您不再啓動和切換線程。它實際上需要減去時間。

+0

感謝漢斯。因此,將這些方法包裝在一個異步幫助器方法中,然後讓它擔心其他3個方法的排序等等。它將簡化調用者的操作。 – 2010-05-07 11:49:10