掌握C#中非同步魔法:同步方法如何優雅調用非同步方法

来源:https://www.cnblogs.com/hanbing81868164/p/18095031
-Advertisement-
Play Games

概述:上述C#示例演示瞭如何在同步方法中調用非同步方法。通過使用`async`和`await`關鍵字,實現了同步方法對非同步方法的調用。建議使用`await`而不是`Result`來避免潛在的死鎖問題。這種模式在處理非同步任務時能夠提高代碼的可讀性和性能。 在C#中,從同步方法調用非同步方法的過程涉及到使用 ...


 

概述:上述C#示例演示瞭如何在同步方法中調用非同步方法。通過使用`async`和`await`關鍵字,實現了同步方法對非同步方法的調用。建議使用`await`而不是`Result`來避免潛在的死鎖問題。這種模式在處理非同步任務時能夠提高代碼的可讀性和性能。

在C#中,從同步方法調用非同步方法的過程涉及到使用非同步編程的關鍵字和模式,主要涉及asyncawait關鍵字。以下是一個簡單的例子,展示如何在同步方法中調用非同步方法:

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 同步方法調用非同步方法
        CallAsyncMethodSynchronously();

        Console.ReadLine();
    }

    // 非同步方法
    static async Task<int> AsyncMethod()
    {
        Console.WriteLine("非同步方法開始執行...");
        
        // 模擬非同步操作,比如從資料庫或遠程服務獲取數據
        await Task.Delay(2000);

        Console.WriteLine("非同步方法執行完成。");

        return 42;
    }

    // 同步方法調用非同步方法
    static void CallAsyncMethodSynchronously()
    {
        Console.WriteLine("同步方法開始執行...");

        // 同步方法中調用非同步方法,使用Wait()方法等待非同步方法完成
        Task<int> asyncTask = AsyncMethod();
        int result = asyncTask.Result; // 使用Result屬性會阻塞當前線程,直到非同步方法完成

        Console.WriteLine($"非同步方法返回的結果為: {result}");
        
        Console.WriteLine("同步方法執行完成。");
    }
}

在上面的例子中,AsyncMethod是一個非同步方法,它模擬了一個非同步操作。然後,
CallAsyncMethodSynchronously
是一個同步方法,它調用了非同步方法,並使用asyncTask.Result等待非同步方法完成。請註意,使用Result屬性可能會導致阻塞當前線程,這在UI線程中可能會引起死鎖問題,因此在實際應用中應該避免在UI線程上使用Result

另外,更推薦的方式是在非同步方法中使用await關鍵字,而不是在同步方法中使用Result。以下是使用await的改進版本:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // 非同步方法調用
        await CallAsyncMethod();

        Console.ReadLine();
    }

    // 非同步方法
    static async Task<int> AsyncMethod()
    {
        Console.WriteLine("非同步方法開始執行...");
        
        // 模擬非同步操作,比如從資料庫或遠程服務獲取數據
        await Task.Delay(2000);

        Console.WriteLine("非同步方法執行完成。");

        return 42;
    }

    // 同步方法調用非同步方法
    static async Task CallAsyncMethod()
    {
        Console.WriteLine("同步方法開始執行...");

        // 使用await等待非同步方法完成
        int result = await AsyncMethod();

        Console.WriteLine($"非同步方法返回的結果為: {result}");
        
        Console.WriteLine("同步方法執行完成。");
    }
}

在這個改進版本中,CallAsyncMethod方法標記為async,並使用await關鍵字等待非同步方法完成,而不是阻塞線程使用Result。這樣能夠更好地保持非同步的特性,避免潛在的死鎖問題。

源代碼獲取:https://pan.baidu.com/s/1THRY6OV6aQYTcN2F2yX4QQ?pwd=6666 

 


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

-Advertisement-
Play Games
更多相關文章
  • 本文介紹基於R語言中的GD包,依據柵格影像數據,實現自變數最優離散化方法選取與執行,併進行地理探測器(Geodetector)操作的方法~ ...
  • 拓展閱讀 馬斯克開源的 grok-1 底層 Transformer 模型論文 《Attention is All You Need》 馬斯克開源的 grok-1 大模型底層 Transformer 模型到底是個啥? 馬斯克開源的 grok-1 大模型硬核源碼第 1 彈 馬斯克開源的 grok-1 大 ...
  • 前言 還有個迭代器,基礎語法基本已經說完了,後面想到啥再補充,之後的教程會從以下方面來講: 基礎庫的使用,比如string、table等 基礎控制項的使用,比如listview、tab等 aardio和Python交互,比如給Python寫個界面 自帶的範常式序 我寫的一些小程式 當然,我的理解也是很 ...
  • 完美收官,本文是爬蟲實戰的最後一章了,所以儘管本文著重呈現爬蟲實戰,但其中有一大部分內容專註於數據分析。爬蟲只是整個過程的起點,其主要目的之一就是為後續數據分析等工作做好準備。通過對爬取的數據進行精確的清洗和分析,可以揭示其中隱藏的規律和趨勢,為決策提供有力支持。因此,爬蟲實戰並不僅僅是技術的展示,... ...
  • 前言 去年又重新刷了路遙的《平凡的世界》,最近也在朋友推薦下,來看了路遙的另一部成名作《人生》。 故事中的主人公高加林,雖生在農村,面朝黃土背朝天,卻不甘心像父輩一樣或者,一心想著擺脫民語的束縛,追求他的理想生活。 然而命運多舛,在他所想象的理想生活中,一次次跌倒,最終不得不承認自己的平凡,生活總得 ...
  • 1 定義 一個數據集是分散式的數據集合。Spark 1.6增加新介面Dataset,提供 RDD的優點:強類型、能夠使用強大lambda函數 Spark SQL優化執行引擎的優點 可從JVM對象構造Dataset,然後函數式轉換(map、flatMap、filter等)操作。Dataset API在 ...
  • 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕等都可能不太一樣。 2、表單的靈活設計及呈現。 3、流程的靈活設計及呈現。 4、介面的調用信息者及性能 ...
  • 概述:WPF支持綁定到對象的屬性而不是欄位,主要因為屬性提供了更多控制和擴展性。屬性包含get和set方法,支持數據驗證和通知屬性更改,而欄位通常被認為是內部實現。使用屬性使WPF能夠更靈活、可控地與數據交互,提高代碼的可讀性和可維護性。 WPF(Windows Presentation Found ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...