簡體   English   中英

如何在 C++/Cli 中使用 awaitable

[英]How to consume an awaitable in C++/Cli

async / await在過去幾年中在 C# 世界中非常受歡迎。 異步函數也傾向於在應用程序中快速傳播:Awaitables 需要等待,因此調用函數必須是異步的,因此也是一個需要等待的 awaitable,等等。

我在 C++/Cli 項目中使用 C# 庫。 該庫公開異步 API。 Visual C++ 編譯器不支持async / await 因此,我無法等待庫提供給我的任何 API。

我有以下選擇:

  • 調用異步函數並“放手”:不是一個選項,因為我經常需要返回值才能繼續。
  • 調用Wait()或訪問異步函數返回的Task / Task<T>對象的Result屬性: 導致UI 線程臭名昭著的死鎖

有什么辦法可以使這項工作? 如果必須的話,我不介意同步執行異步 API。

對我來說,聽起來你的問題更像是一個更大問題的征兆。 我個人盡量避免將業務邏輯放在 C++-CLI 模塊中。 具體來說,我嘗試將ref class功能限制為 3 個主要領域:

  • 將托管方法調用轉換為本地方法調用(包括必要時轉換參數)。
  • 將本機返回值轉換為托管返回值。 這甚至可以將接收回調的異步函數轉換為返回Task的方法。
  • 將本機事件(回調)轉換為托管事件。

我可能是錯的,但在你的情況下,聽起來你的 C++ 代碼沒有很好地解耦,你最終將它的不同部分連接到 C++-CLI 模塊中。

至於你的問題,我會使用Task.ContinueWith系列方法來執行異步延續而不是async / await 然而,如果您希望在特定SynchronizationContext (例如 UI 線程)上調用延續,則必須特別注意提供正確的TaskScheduler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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