Parallel Pattern Library(PPL)學習筆記

来源:https://www.cnblogs.com/ninja-ken/archive/2018/12/31/How_To_Catch_Exceptions_From_PPL_Tasks.html
-Advertisement-
Play Games

列舉了task-based和value-based兩種拋異常情形的catch方法 ...


關於PPL是什麼,可以搜索關鍵字MSDN PPL瞭解詳情。這裡談一下困擾自己好一陣子的一個地方--task chain中拋出異常的處理,一來可為其他碼農同行參考,二來給自己做個記錄,以免日後忘卻。

Value-based continuation的成功嘗試

void testValueBasedContinuation()
{
    concurrency::task<void> task1([] {
        throw std::exception("Hello"); });

    //set a breakpoint here, and see the wcout IS executed
    auto task2 = task1.then([]() {
        std::cout << "continuation" << std::endl;
    });

    try
    {
        task2.wait();
    }
    catch (std::exception& e)
    {
        std::cout << "exception" << std::endl;
    }
}

這裡的要點在於,value-based continuation中continuation task的執行一定是在previous task執行完成之後,因此將continuation task用try catch(T-C)保護起來即可。(個人猜測,value-based chain會在同一個線程中執行)

錯誤的寫法包括:

  1. 直接將task1的聲明用try catch保護起來
  2. 直接將auto task2一句用try catch保護起來

原因是,聲明處並不是task的真正執行的地方,保護起來並沒有作用

 導致PPL庫拋出如下異常

        ~_ExceptionHolder()
        {
            if (_M_exceptionObserved == 0)
            {
                // If you are trapped here, it means an exception thrown in task chain didn't get handled.
                // Please add task-based continuation to handle all exceptions coming from tasks.
                // this->_M_stackTrace keeps the creation callstack of the task generates this exception.
                _REPORT_PPLTASK_UNOBSERVED_EXCEPTION();
            }
        }

 

 

Task-based continuation的成功嘗試

void testTaskBasedContinuation()
{
    concurrency::task<void> task1([] {
        throw std::exception("Hello"); });
    auto task2 = task1.then([](concurrency::task<void>& previous) {
        previous.get();
        std::cout << "continuation" << std::endl;
    });
    try
    {
        task2.wait();
    }
    catch (std::exception& e)
    {
        std::cout << "exception" << std::endl;
    }
}

這裡的關鍵是previous.get()那一行,保證代碼會在那裡拋出異常(而不是其他的線程,個人猜測).


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • org.hibernate.exception.SQLGrammarException:could not insert ...
  • VSCode配置JAVA開發環境 1:給機器安裝JDK、MAVEN 下載JDK 下載路徑:https://www.oracle.com/technetwork/java/javase/downloads/jdk11 downloads 5066655.html 配置JAVA的環境變數 我的JDK在硬 ...
  • 一.random模塊 隨機 random() 隨機小數 uninform(a,b) 隨機小數 randint(a,b) 隨機整數 choice() 隨機選擇一個 sample() 隨機選擇多個 shuffle() 打亂 二.Counter 計數 三.字典 1.預設值字典 2.有序字典 四.棧和隊列 ...
  • 難點:如何測試。我的解決方式是:a,三種解法,看結果是否一致。b,小數據(100個點),人工排查。第一種方法,暴力法適合小數據。第二種方法:我的改進型。第三種方法:經典方法(分治法)。實驗證明1000萬數據時,我的演算法有優勢。暴力演算法,O(n2)。我的改進型要點:先對所有數據按Y排序。只比較y距離小 ...
  • 此文章非常詳細介紹了Springboot2.0與Mybatis的整合,並且採用Rest風格作為輸入和輸出,項目還使用了兩個很優秀的工具,一個是:Mybatis-Generator代碼生成器,可以方便生成PO、Mapper介面、MapperXml映射文件,而且直接配置生成到項目指定目錄下,不用做任何修... ...
  • 題目內容: 對數字求特征值是常用的編碼演算法,奇偶特征是一種簡單的特征值。對於一個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下一個1,否則記下一個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就形成了一個 ...
  • 0x01 前言 2018年8月22日,Apache Strust2發佈最新安全公告,Apache Struts2存在遠程代碼執行的高危漏洞(S2-057/CVE-2018-11776),該漏洞由Semmle Security Research team的安全研究員Man YueMo發現。該漏洞是由於 ...
  • [TOC] 1. 為什麼要爬蟲? “大數據時代”,數據獲取的方式: 大型企業公司有海量用戶,需要收集數據來提升產品體驗 【百度指數(搜索),阿裡指數(網購),騰訊數據(社交)】 數據管理咨詢公司: 通過數據團隊專門提供大量數據,通過市場調研,問卷調查等 政府/機構提供的公開數據 中華人民共和國統計局 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...