c# 非同步程式設計(async + await + HttpClient)
前沿
WPF應用中,有時需要從網路獲取資料,由於網路原因這個過程會耗時很久。為了防止UI介面不卡死,需要進行非同步程式設計。c#中HttpClient可以很好的進行非同步網路請求。但是其中存在一個問題,HttpClient的請求都是非同步的,應該如何進行同步呼叫呢?
知識準備
- C# 中的 Async 和 Await 關鍵字是非同步程式設計的核心。使用 async 和 await 定義的非同步方法簡稱為“非同步 (Async) 方法”。
- async 和 await 關鍵字不會建立其他執行緒。
- 非同步方法不等同於多執行緒。
- 按照約定,非同步方法的名稱以“Async”字尾結尾。
- 非同步方法返回型別:
- 如果你的方法有運算元為 TResult 型別的返回語句,則為
Task<TResult>
- 如果你的方法沒有返回語句或具有沒有運算元的返回語句,則為 Task。
- 如果你的方法有運算元為 TResult 型別的返回語句,則為
- 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新特性之非同步程式設計(Async和Await)的使用
一、簡介 首先來看看.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#]非同步程式設計: async和await(2)
一、哪裡來的執行緒? async標記的方法的方法體會被編譯到一個內部結構體的MoveNext方法中,有兩個MoveNext呼叫者是來自於主執行緒之外的同一個工作執行緒。 這一個執行緒是何時發起的呢? Task相關的操作有哪些? 1 // 三、理解await 2 bool '<&