1. 程式人生 > >c# 非同步程式設計(async + await + HttpClient)

c# 非同步程式設計(async + await + HttpClient)

前沿

WPF應用中,有時需要從網路獲取資料,由於網路原因這個過程會耗時很久。為了防止UI介面不卡死,需要進行非同步程式設計。c#中HttpClient可以很好的進行非同步網路請求。但是其中存在一個問題,HttpClient的請求都是非同步的,應該如何進行同步呼叫呢?

知識準備

  • C# 中的 Async 和 Await 關鍵字是非同步程式設計的核心。使用 async 和 await 定義的非同步方法簡稱為“非同步 (Async) 方法”。
  • async 和 await 關鍵字不會建立其他執行緒。
  • 非同步方法不等同於多執行緒。
  • 按照約定,非同步方法的名稱以“Async”字尾結尾。
  • 非同步方法返回型別:
    • 如果你的方法有運算元為 TResult 型別的返回語句,則為 Task<TResult>
    • 如果你的方法沒有返回語句或具有沒有運算元的返回語句,則為 Task。
  • await 可以將當前方法掛起,執行執行緒切換到非同步方法的呼叫方。

示例程式碼

class Program
    {
        static void Main(string[] args)
        {
            Method1();
            Method2();
            Method3();
            Console.ReadKey();
        }



        private async static Task MethodAsync()
        {
            Console.WriteLine("enter MethodAsync"
); await Task.Run(()=> { Thread.Sleep(3000); }); Console.WriteLine("quit MethodAsync"); } static void Method1() { Console.WriteLine("Method1"); } static async void Method2() { Console
.WriteLine("enter Method2"); await MethodAsync(); Console.WriteLine("quit Method2"); } private static void Method3() { Console.WriteLine("Method3"); } }

執行結果:

本示例展示了非同步方法的呼叫和以同步的方式呼叫非同步方法(聽起來有點怪,既然要以同步方法呼叫非同步方法,為何不直接呼叫同步方法代替使用非同步方法)。

  • 定義一個MethodAsync非同步方法。
  • Method2()依賴於MethodAsync的返回,必須等MethodAsync執行完畢才能返回Method2()。
  • 在Method2()使用await強制表示了Method2()依賴於MethodAsync的返回。
  • 需要說明的是,只有在非同步方法中才能使用await同步呼叫另一個非同步方法。

HttpClient的同步呼叫

將上例中的MethodAsync()當成HttpClient的非同步請求方法即可。

相關推薦

c# 非同步程式設計async + await + HttpClient

前沿 WPF應用中,有時需要從網路獲取資料,由於網路原因這個過程會耗時很久。為了防止UI介面不卡死,需要進行非同步程式設計。c#中HttpClient可以很好的進行非同步網路請求。但是其中存在一個問題,HttpClient的請求都是非同步的,應該如何進行同步呼

非同步程式設計async&await

 前言 本來這篇文章上個月就該釋出了,但是因為忙 一直沒有時間整理,所以耽擱到今天,現在迴歸正軌。 C# 5.0 雖然只引入了2個新關鍵詞:async和await。然而它大大簡化了非同步方法的程式設計。 在 執行緒池(threadPool)大致介紹了微軟在不同時期使用的不同的非同步模式,有3種: 1.

.NET4.5新特性之非同步程式設計AsyncAwait的使用

一、簡介   首先來看看.net的發展中的各個階段的特性:NET 與C# 的每個版本釋出都是有一個“主題”。即:C#1.0託管程式碼→C#2.0泛型→C#3.0LINQ→C#4.0動態語言→C#4.5非同步程式設計   下面我來簡單的介紹一下非同步程式設計:非同步程式設計,在 .NET Framework

從回撥callback到 Promise 到非同步函式async await

在 promise 被加入到 JavaScript 語言之前,非同步程式碼一般使用基於回撥的 API,尤其是在 Node.js 中。這是一個例子: function handler(done) { validateParams((error) => { if (error) r

ES7 非同步函式 async await

1.先說說Promise物件 Promise是ES6中處理非同步操作的一個新方式,Promise物件有三種狀態:Pending(進行中)、Resolved(已完成,又稱 Fulfilled)和 Rejected(已失敗),寫法如下: //1)建立promis

非同步程式設計async/await

async/await 和 Generators + co 的寫法非常的相似,只是把用於宣告 Generator 函式的 * 關鍵字替換成了 async 並寫在了 function 關鍵字的前面,把 yield 關鍵字替換成了 await;另外,async 函式是基於 Promise 的

浙大版《C語言程式設計第3版》題目集 - 習題11-5 指定位置輸出字串20 分

題目連結:點選開啟連結   題目大意:略。   解題思路:略。   AC 程式碼 char *match( char *s, char ch1, char ch2 ) { char *p=s, *h; int fst=1,

浙大版《C語言程式設計第3版》題目集 - 習題11-7 奇數值結點連結串列20 分

題目連結:點選開啟連結   題目大意:略。   解題思路:題目說刪除了,其實可以轉化為再搞一個獲取奇數時的做法來做偶數的情況,最後把地址賦值給L,這樣思路就簡單許多~。還有這裡帶兩個星號的L,其實多了一個星號是因為傳參時,傳進去的是指標變數的地址(此地址非內容

C語言程式設計第二版新版》第一章習題解答部分

1-20 //My solution:先將輸入字串儲存至陣列,將其detab後存入另一陣列,然後列印該陣列 #include <stdio.h> #define MAXLINE 100 #define TABSIZE 8 #define TAB '\t' in

浙大版《C語言程式設計第3版》題目集函式題練習5-1

練習5-1 求m到n之和(10 分) 本題要求實現一個計算m~n(m 函式介面定義: int sum( int m, int n ); 其中m和n是使用者傳入的引數,保證有m < n。

C語言程式設計圖形庫應用--導航

** 1.引言 ** 最近又開始研究以前高中接觸的C++圖形庫(easyx),準備在此基礎上進行一些有趣的例項開發並做一些C語言程式設計教程。 2.開發環境 Visual Studio C

浙大版《C語言程式設計第3版》題目集函式題練習5-3

練習5-3 數字金字塔(15 分) 本題要求實現函式輸出n行數字金字塔。 函式介面定義: void pyramid( int n ); 其中n是使用者傳入的引數,為[1, 9]的正整數。

基於TCP/IP協議的C++網路程式設計API函式版

原始碼:http://download.csdn.net/detail/nuptboyzhb/4169959 基於TCP/IP協議的網路程式設計 定義變數——獲得WINSOCK版本——載入WINSOC

浙大版《C語言程式設計第3版》題目集前四章總結-續

練習4-11 統計素數並求和   (20分) 本題要求統計給定整數MM和NN區間內素數的個數並對它們求和。 輸入格式: 輸入在一行中給出兩個正整數MM和NN(1\le M\le N\le 5001≤M≤N≤500)。 輸出格式: 在一行中順序輸出MM和NN區間內

浙大版《C語言程式設計第3版

2.1.1.2 計算機和程式語言:計算機的思維方式 程式的執行 解釋:藉助一個程式,那個程式能試圖理解你的程式,然後按照你的要求執行。 編譯:藉助一個程式,就像一個翻譯,把你的程式翻譯成計算機真正能懂的語言——機器語言——寫的程式,然後,這個機器語言寫的程

試讀《C#高階程式設計第9版》有感

        在寫這篇書評之前,我想先說一下自己。我是一名對日外包程式設計師,自己從事外包工作也已經有八個年頭了。開始接觸軟體開發,我是從學習Java語言入手的,自己從事了外包這一行,才發現自己單純的會一種程式語言是遠遠不夠。當你被公司重視的時候,成為了一名軟體專案的消防

浙大版《C語言程式設計第3版》題目集函式題習題5-1

習題5-1 符號函式(10 分) 本題要求實現符號函式sign(x)。 函式介面定義: int sign( int x ); 其中x是使用者傳入的整型引數。符號函式的定義為:若x大於0,

譚浩強C語言程式設計第三版部分課後題答案,自己整理的

第一篇部落格,也不知道怎麼寫,就把以前的筆記發上來吧 學了半年後寫的,可能稍顯不規範,或有的多餘,將就看吧,也不想再改了 1.5 #include<stdio.h> void main() {printf("******************\n");pr

非同步程式設計Async,Await和ConfigureAwait的關係

在.NET Framework 4.5中,async / await關鍵字已新增到該版本中,簡化多執行緒操作,以使非同步程式設計更易於使用。為了最大化利用資源而不掛起UI,你應該儘可能地嘗試使用非同步程式設計。雖然async / await讓非同步程式設計更簡單,但是有一些你可能不知道的細節和注意的地方&nb

[C#]非同步程式設計: asyncawait2

一、哪裡來的執行緒? async標記的方法的方法體會被編譯到一個內部結構體的MoveNext方法中,有兩個MoveNext呼叫者是來自於主執行緒之外的同一個工作執行緒。 這一個執行緒是何時發起的呢? Task相關的操作有哪些? 1 // 三、理解await 2 bool '<&