2016-03-04 76 views
3

我正在編寫一些新代碼並希望使用async編寫它並等待,但調用代碼當前未用async編寫。以異步方式編寫新代碼並將其稱爲同步,直到調用代碼支持異步爲止是正確的嗎?在異步中寫入新代碼但調用同步

或者我應該寫代碼同步,然後在稍後的日期轉換它?這會被視爲技術債務嗎?

public Result Execute(Paramerters parameters) { 
    return ExecuteAsync(parameters).Result; 
} 

public Task<Result> ExecuteAsync(Paramerters parameters) { 
    ... 
} 

Execute是在一個接口上,並從一些還不是異步的其他代碼調用。創建異步版本並從Execute調用它是否正確,直到調用Execute的代碼轉換爲異步? 我的舊代碼是用.net 4.5.1編寫的,但尚未轉換爲async。

+4

我強烈建議堅持使用「異步一路下來」的口頭禪並立即更新代碼。這是一個很好的閱讀主題:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html還要記住,「我們將修復其餘的稍後「方法很可能是整個軟件開發行業最普遍的錯覺。不要完成一半的事情。要麼使代碼異步或不要。 – David

+5

這就是所謂的「異步同步」並且是反模式。它通常是*一個非常糟糕的主意,並且一些異步同步或異步同步的組合可能*完全死鎖* ... –

回答

3

http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx在爲什麼要避免這種情況以及如何減輕問題方面都有一些優點。

然而,

或者我應該寫代碼同步然後將其轉換在以後的日子?

這可能更容易,而且完全擺脫了這個問題。

這會被視爲技術債務嗎?

根據定義是,雖然:

  1. 您可能需要有同步調用到未來,無論如何,以支持這種情況下,這樣你就已經擁有了技術債務,你只是處理它。

  2. 已經有這個技術債務。你說過,「但是調用代碼目前不是用async寫的」。那裏,那是你的債務,已經在那裏。

  3. 如果同步和異步版本互相鏡像(非常常見),並且將方法放在雙胞胎旁邊,可以很容易地同時對每個方法進行大部分更改。

0

取決於ExecuteAsync是否會產生顯着差異。

假設ExecuteAsync做了以下內容:

public Task<Result> ExecuteAsync(Paramerters parameters) { 
    List<Task> tasks = new List<Task>(); 
    foreach(var param in parameters) 
    { 
     var task = ExecuteSomethingElseAsync(param); 
     tasks.Add(task); 
    } 
    Task.WhenAll(tasks.ToArray()); 
} 

假設ExecutingSomethingelse是IO密集型的其他任務將無需等待ExecuteSomething其他方法,以便返回的東西爲它移動到下一個PARAM執行。如果您要同步執行此操作,則執行將不得不等待,並且總執行時間可能會變慢。

如果被調用的方法執行其他異步方法,則同步調用anyc方法可能包含一些好處。

+0

我的代碼正在執行數據庫調用 –

2

我有一個有關brownfield async development主題的MSDN文章 - 也就是將async引入同步代碼庫。有幾種不同的方法,每種方法都有自己的優點和缺點。我的選擇是使用標誌參數黑客,因爲這樣的:

public Result Execute(Parameters parameters) 
{ 
    return ExecuteCoreAsync(parameters, sync: true).GetAwaiter().GetResult(); 
} 

public Task<Result> ExecuteAsync(Parameters parameters) 
{ 
    return ExecuteCoreAsync(parameters, sync: false); 
} 

private async Task<Result> ExecuteCoreAsync(Parameters parameters, bool sync) 
{ 
    if (sync) 
    { 
    Thread.Sleep(2000); // sync implementation 
    return new Result(); 
    } 
    else 
    { 
    await Task.Delay(2000); // async implementation 
    return new Result(); 
    } 
} 

是的,如果底層的操作自然是異步的,然後同步API是技術債務。