簡體   English   中英

Concurrency::task.wait() 拋出 invalid_operation

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

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