2017-07-07 109 views
0

我一直要求實現這樣的:切換同步和異步行爲

public async Task<IHttpActionResult> Get(bool sync) 
{ 
    if(sync) 
    { 
     ...sync behavior 
    } else 
    { 
     ...async behavior 
    } 
} 

現在,我明白的同步/異步行爲和線程的基本知識,並很擔心的事情這可能會出錯(異步代碼同步運行,線程阻塞,返回一個任意的任務來匹配方法簽名通常是草率的,等等......),但還不足以說明此代碼是一個壞主意。所以,我的問題:這是否總是不好的做法,或者有沒有可能的情況下呢?

+1

由於各種原因,最好有2種不同的方法。如果沒有別的辦法,異步方法的命名約定通常是添加'Async'後綴,'GetAsync(sync:false)'看起來很討厭。此外,當您通過非同步路徑時,不需要等待。呃,感覺很可怕。 – DavidG

+0

這是我的確切答案和反應,謝謝!我的職業情況稍微複雜一些,因爲我是移動團隊(和初級)的唯一API開發者,需要能夠告訴我的高級團隊領導,足夠明確,「不,這不起作用。「,特別是爲什麼。 – dylanthelion

+0

實際上是否存在同步和異步變化以適應此方法的工作方式,或者您是否被迫僞造一個或另一個(例如,通過「Task.Run」或「.Wait」或「.Result」調用)?在大多數情況下,只有一個或另一個,它應該把它的調用棧上的「同步性」或「異步性」推得比這裏更高。 –

回答

0

異步方法將同步運行,直到它們達到await。如果await正在等待結果,則返回控制權。

因此,只要異步路徑使用await,代碼沒有任何問題。

但重要的是要注意,這是一個異步方法不等待任何長時間運行的操作,它將被同步執行!所以,即使你使用等待,也不能保證控制權被退回。

+0

等待任務需要幾秒鐘到10秒以上的時間。但是你說,只要在異步路徑上等待着什麼,我不會引入任何危險或不穩定性,這會通過使用兩種不同的方法來避免? – dylanthelion

+0

總之:是的。人們可以說這是一些不良做法。因爲主叫方不知道該方法會如何反應。但從技術上講,你是完全安全的。 – Iqon