[英]Wrap a synchronous method in Asynchronous call c#
我希望將同步方法包裝到異步代碼中,以便將這些方法公開為異步 - 原因是我不想在同步方法中復制代碼,因為我希望它是 DRY 並且已經知道同步的功能代碼有效 - 也不需要管理單獨的方法。 但是我想要異步方法。 我至少了解異步方法的用途以及為什么要使用它們。
考慮以下代碼:
public int AddValues(int a, int b)
{
// some really boring or extremely long DRY method code
return a + b;
}
添加如下異步調用方法可以節省編寫代碼的時間; 確保內部代碼的功能與同步代碼相同。 我可以或應該這樣做嗎?:
public async task AddValuesAsync(int a, int b)
{
return await Task.FromResult(AddValues(a,b));
}
這是我的另一個問題,也許是我的答案; 兩次調用異步方法也會調用同步方法 - 由於它在異步之后,我可以獲得跨線程異常嗎? 那是對的嗎。
那么在這種情況下我應該怎么做 - 如何保持干燥並保持簡單? 我可以將同步方法設為私有並強制所有對該方法的調用為 Async ..
如果你說我的示例代碼是一種不好的方法,請給出一個簡短的原因和一個簡單的例子來說明一個好的方法......以及關於什么是最好的以及如何做到這一點的任何建議?
我在這里查看是否將同步調用包裝在 Task.Run() 中以使其異步有益? 但這似乎沒有回答很清楚,我想知道什么。
編輯
對於正在尋找的其他人 - 除了此處標記的答案之外,還有一些信息指向帶有示例的答案,更重要的是為什么。
我之所以問這個,是因為我想知道使同步方法在類中具有異步版本並盡可能 DRY 的正確方法是什么。
正確的方法是“不要” 。
更重要的是,您的 API 不應該說謊。 如果他們在做同步工作,他們應該有一個同步簽名。
在 Stephen Cleary 發表評論后,我找到了一個相關鏈接.. 將同步代碼包裝成異步方法的最佳方法是什么
雖然措辭不准確 - 一條評論包括一篇文章鏈接,該鏈接的措辭完全符合我的問題的一點。
Yuval Itzchakov 在那里的評論包括這一點。 “有一篇很棒的文章我應該為同步方法公開異步包裝器嗎?由 Stephan Toub 撰寫,其中討論了不做您想做的事情的所有原因。我建議閱讀它。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.