[英]Concurrency::task.wait() throws invalid_operation
Concurrency::task.wait()
拋出invalid_operation
異常: “在 Windows 運行時 STA 中等待任務是非法的。”
此異常自 2022 年 11 月 14 日起發生,似乎與 Microsoft 更新相關。
在調試模式下構建時不會發生異常。 編輯:僅適用於某些 Visual Studio 版本。 無論調試模式還是發布模式,最新版本都會拋出異常。
該代碼作為托管 C++ 在 C++ 應用程序中運行。
在這方面有任何已知的 Microsoft 問題嗎? 編輯:異常似乎是正確的,但直到某些更新才出現。
我也是最近才遇到這個錯誤,而沒有對代碼進行任何已知的更改。
我的問題涉及 Microsoft C++ Rest SDK。特別是像這樣的電話
try {
response = client.request(request).get();
} catch (...) {
}
如果通過CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
進行單線程COM
初始化,則會出現此問題; 或CoInitialize(NULL);
在調用Concurrency::task.wait()
之前完成。
這個問題可以通過初始化COM
來解決
CoInitializeEx(NULL, COINIT_MULTITHREADED);
要么
Windows::Foundation::Initialize(RO_INIT_MULTITHREADED);
如果你想在一個已經初始化為COINIT_APARTMENTTHREADED
的線程上調用Concurrency::task.wait()
並且你不能更改它 - 通過例如std::thread
在一個新線程中啟動你的並發任務。
至少就我而言,這是由 2022 VC++ 可再發行組件的更新引起的。
https://github.com/microsoft/STL/pull/3255
它會影響編譯為 2015 Visual Studio 工具集的代碼,以及安裝了 2022 redist 的計算機。
STL 開發人員給我的建議如下:
我會說優先順序是:工具集升級 > 應用程序本地 DLL > 嘗試將 VS 2022 17.3 的 DLL 排除在機器之外。 最后一個可能是一場失敗的戰斗,因為任何正在安裝的應用程序都可能會嘗試安裝更新的 VCRedist。 Static 鏈接也可以避免這種情況,是的,但是對於由多個用戶 DLL 構成的任何內容,這通常是一個極具侵入性的更改。
雖然推測該問題已被確定並且應該在 VC++ redist 的未來版本中得到修復。
作為臨時修復,我能夠使用類似於以下的代碼來解決問題:(使用 cpprestsdk)
try{
auto task = client.request(request);
while (!task.is_done()) { }
response = task.get();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.