我正在開發一個實現協議棧的類庫。在那裏我有一個實現IAsyncResult的異步操作DoSomething。此方法的用戶可以使用BeginDoSomething和EndDoSomething。只要這是一個很普遍的任務。取消異步操作
現在我得到了使異步操作中止的要求。我能想到的幾種方法來實現這一點,但我不知道哪一個是最好的:
- 有除了BeginDoSomething和EndDoSomething一個CancelDoSomething方法。這不是常見的asaync模式,因此不容易找到操作的用戶。
- 根據沒有。 1:有取消屬性
- 由BeginDoSomething返回的IAsyncResult實例可以被轉換爲DoSomethingAsyncResult。 DoSomethingAsyncResult有一個Cancel方法。再一次,這不是異步模式的常見用法,也很難知道類庫的「普通用戶」。
- 根據沒有。 3:有取消屬性
- BeginDoSomething返回的IAsyncResult實例實現IAbortableAsyncResult:
public IAbortableAsyncResult:IAsyncResult { void Abort(); }
。對我來說,這似乎是最優雅的方式。當用戶使用BeginDoSomething開始操作時,他會得到一個IAbortableAsyncResult的實例,這意味着這個特殊功能會突出地介紹給他。
什麼是最佳解決方案?有更多的方法可以解決這個問題嗎?我更喜歡不。 5,因爲它沒有代碼味道(至少我現在還沒有認出)。
[編輯]
不依賴於TPL/.NET 4的一種方法被理解爲具有一個解決方案,也適用於不能被移植到.NET架構中的最新版本的舊代碼。
[/編輯]
感謝您的回答。我知道TPL,它是取消功能。對不起,我沒有提到這個問題。我更多地尋找一種解決方案,它不會使用.NET 4功能,但更適用於傳統代碼。 – PVitt
當我在TPL中看到它時,我非常喜歡這種模式,所以當我不得不在緊湊框架中編寫類似的代碼時,我只是將模式移植到了其中。儘管TPL中的實施經過了高度優化,但您沒有理由不能在傳統設置中推出自己的版本以達到相同的目的。 –
嗯,好主意。還沒有想到它。 – PVitt