2015-01-21 83 views
-2

我最近一直在閱讀有關任務的許多內容,我不得不說我認爲我瞭解它,但是一旦您閱讀Stephen Cleary和Jon Skeet的博客,我已經開始意識到那裏更多的是它比人們想象的更多。接口是任務,但我沒有任何異步代碼

因此,我正在實現一個基於TASK的接口(這不是我的接口,它是AspNet.Identity IUserPasswordStore的一部分),這是實現它的正確方法嗎?

public Task<bool> HasPasswordAsync(ApplicationUser user) 
{ 
    return Task.Factory.StartNew(() => true); 
} 

這是有點兒一個微不足道的問題,但你永遠不知道他們可能是一個「啊,但你可知道,這是不行的」

代碼的其餘部分全部由異步代碼變得如此有點剛剛寫自己,好吧,我需要將開始/結束模式轉換爲TAP。

+0

請仔細閱讀接口部分,我將編輯和添加這就是它不是我的接口。 – 2015-01-21 13:55:58

回答

0

你沒有閱讀能力不夠好:)

在任何情況下,當你只是想在完成任務包的結果,沒有必要旋轉了新的線程池的工作。只需使用

Task.FromResult(false) 

對於這種情況,可以在接口中公開Task。但是,如果您只是使用Task.Run或類似的,請不要。這正是斯蒂芬博客上發現的那種「糟糕的想法」。如果你的界面看起來足夠寬以容納固有的異步事件並且同時具有固有的同步性,那麼你可能需要縮小界面的範圍。

+0

謝謝,我應該真的看起來更難:) – 2015-01-21 13:59:39

0

我正在實現一個基於TASK的接口,難道這是 正確的方法來實現這個?

一般來說,沒有。 You shouldn't expose async wrappers over sync methods

爲什麼你不應該這樣做?因爲它可能會讓最終用戶感到困惑,因爲它認爲你的方法純粹是一個異步的IO綁定操作(因爲這是大多數BCL公開給我們的),但會驚訝地發現它實際上不是。

這就是爲什麼推薦的方法是讓讓用戶明確調用一個新線程的同步版本

相反,這樣做:

public bool HasPassword(ApplicationUser user) 
{ 
    return true; 
} 

而讓委託它:

var hasPassword = Task.Run(() => HasPassword(user));