簡體   English   中英

在異步調用 c# 中包裝同步方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM