1. 程式人生 > >C#中的非同步委託

C#中的非同步委託

非同步委託

預設情況下,執行一個委託例項操作是同步的,但委託例項同樣可以使用成員函式BeginInvoke()進行非同步回撥。

  • BeginInvoke()除了接收原有委託簽名的引數之外,引數表尾部額外帶有兩個引數,分別為AsyncCallback委託型別和object型別。
  • AsyncCallback委託在回撥委託執行結束之後觸發,AsyncCallback委託接收一個IAsyncResult型別的引數。
  • object型別用於傳遞一些引數給AsyncCallback委託。
  • BeginInvoke()的最後兩個引數可以為null
  • BeginInvoke()返回IAsyncResult型別:
    1. 使用IAsyncResult.IsCompleted
      屬性可以判斷回撥委託的執行狀態。
    2. 使用IAsyncResult.AsyncState屬性獲取BeginInvoke()引數表中的最後一個object型別的傳入引數。

使用EndInvoke()等待非同步委託返回

如果需要等待非同步執行的委託結束,可以使用EndInvoke()成員函式。

  • EndInvoke()接受一個IAsyncResult型別的引數(即BeginInvoke()的返回值)。
  • EndInvoke()的返回值即為非同步委託的返回值。
  • 在非同步委託執行完畢之前,EndInvoke()會一直阻塞當前執行緒,直到非同步委託結束。

如下程式碼所示:

“`csharp
using System;
using System.Threading;

delegate int Delegate();

class Program
{
static void Main(string[] args)
{
//用於回撥的委託
Delegate del = () =>
{
Thread.Sleep(1000);
Console.WriteLine(“Thread is running!”);
return 100;
};

      //使用BeginInvoke()進行非同步委託回撥
      IAsyncResult result = del.BeginInvoke(ar =>
      {
          //非同步委託結束時執行該Lambda,列印傳入引數
          Console.WriteLine("The object arg is: {0}", (int)ar.AsyncState);
      }, 200);

      Console.WriteLine("Program start...");
      Console.WriteLine("The return value is: {0}", del.EndInvoke(result));

      //使用IAsyncResult.IsCompleted屬性判斷委託是否執行完畢
      Console.WriteLine("The thread status is: {0}", result.IsCompleted);
  }

}
“`

執行結果:


Program start...
Thread is running!
The return value is: 100
The thread status is: True
The object arg is: 200

委託例項del雖然先被呼叫,但由於是非同步呼叫,Sleep()了1000毫秒之後再輸出的字元位於主執行緒之後。

使用WaitOne()等待非同步委託返回

BeginInvoke()的返回值IAsyncResult型別的AsyncWaitHandle屬性會返回一個WaitHandle型別的等待控制代碼:
- 該控制代碼的成員方法WaitHandle.WaitOne()接受int型引數作為超時時間,使用此方法可以實現等待指定時間(單位為毫秒)的效果。
- WaitHandle.WaitOne()的返回值為bool型別,用於表示非同步委託是否結束。

如下程式碼所示:

“`csharp
using System;
using System.Threading;

delegate int Delegate();

class Program
{
static void Main(string[] args)
{
//用於回撥的委託
Delegate del = () =>
{
Thread.Sleep(1000);
Console.WriteLine(“Thread is running!”);
return 100;
};

      //使用BeginInvoke()進行非同步委託回撥
      IAsyncResult result = del.BeginInvoke(ar =>
          Console.WriteLine("The object arg is: {0}", (int)ar.AsyncState), 200);

      Console.WriteLine("Program start...");
      if (result.AsyncWaitHandle.WaitOne(1000))
          Console.WriteLine("The return value is: {0}", del.EndInvoke(result));

      //使用IAsyncResult.IsCompleted屬性判斷委託是否執行完畢
      Console.WriteLine("The thread status is: {0}", result.IsCompleted);
  }

}
“`

執行結果:


Program start...
The thread status is: False

可以看到,超時時間設為1000毫秒,此時非同步委託尚未執行完畢,因而IAsyncResult.IsCompleted屬性為false

相關推薦

C#中非同步匿名委託和Lambda表示式

C#中async/await真的是大大簡化了非同步程式的編寫,但往往我們可能忽略了非同步匿名委託和Lambda表示式。直接上程式碼:class Program {     static void Main(string[] args)     {         Func&l

C#泛型委託例項

本文部分註釋部分來源於書籍和官網網摘。  委託可以定義它自己的型別引數。  Generic delegates are especially useful in defining events based on the typical design pattern b

C#中的委託_多播委託_以及事件的概要

1:委託            我們定義一段程式碼:Person   obj   =   new   Person   (); ,就是說

Node中非同步同步的實現

使用過node的朋友都知道,它最重要的也是最值得稱道的就是使用了非同步事件驅動的框架libuv,這個框架使得被稱為玩具語言的JavaScript也在後端語言中佔了一席之地(當然V8的高效能也是功不可沒,而且libuv的程式碼非常優雅,很值得大家的學習。不過libuv整個框架很大,我們不可能只通過一篇文章就能瞭

jQuery中非同步問題:資料傳遞

最近寫一個新頁面,涉及到非同步問題,為了獲得非同步過程中的資料,以下分享兩種方法; 兩種方法一句話總結: 方法一,Http請求後呼叫.then實現response的資料同步,然後根據resp接著處理; 方法二,使用ES6中的Promise語法糖,實現非同步等待resp;   方法一的程式碼

C#裡的委託和事件實現Observer(觀察者)

  一、委託的簡介 1、委託的宣告: delegate  HandlerName ([parameters])  例如: public delegate void PrintHandler(string

C# Winform 利用委託非同步實現Button長按,TextBox內值累加累減,彈起停止

功能需求::         按下“+”按鈕實現設定值加0.1,長摁“+”按鈕實現設定值一直以0.1的基數累加,按鈕彈起,停止累加。同樣,摁下“-”按鈕實現設定值減0.1,長摁“-”按鈕實現設定值一直以0.1的基數累減

《隨筆十四》—— C++中的 “ 委託建構函式 (C++11)”

目錄 委託建構函式 委託建構函式 ● 一個委託建構函式使用它所屬類的其他建構函式執行它自己的初始化過程, 在委託建構函式內,成員初始值列表只有一個唯一的入口, 就是類名本身(就是同類的其他建構函式的類名)。 類名後面的引數列表必須與類中另外一個建構函式匹配。 c

《隨筆十九》——C#中的 “ 委託 、 Lambda 表示式”

目錄 什麼是委託 使用委託的步驟 給委託賦值 組合委託 為委託新增方法 為委託移除方法 呼叫委託 呼叫帶返回值的委託 呼叫帶引用引數的委託 匿名方法 使用匿名方法 匿名方法的語法 Lambda 表示式 什麼是委託 ● 

C# 簡單的委託

1.委託(其中一種寫法): 一個委託包含以下的方法1和方法2,一個方法1可對應多個方法2,方法2相當於引數,在實際呼叫的時候寫入不同的方法名即可 方法1:方法名(Action <引數1型別,引數2型別……>回

分分鐘用上C#中的委託和事件

  每一個初學C#的程式猿,在剛剛碰到委託和事件的概念時,估計都是望而卻步,茫然摸不到頭腦的。百度一搜,關於概念介紹的文章大把大把的,當然也不乏深入淺出的好文章。可看完這些文章,大多數新手,估計也只是信心滿滿的覺得自己看懂了,一旦要在自己的程式中用上委託和事件,就傻眼了,根本不知道什麼情況下該用,也不知

C#內建委託之Action與Func

在C#語言的using system的名稱空間下,有兩個內建委託:Action與Func 1.Action委託(都沒有返回值): Action:無參,無返回值; Action<T>:有引數T(1~16 個),無返回值; 2.Func委託(都有返回

c# 泛型委託

public delegate tr func<t1, t2, tr>(t1 p1, t2 p2);//泛型委託 //TR 返回的委託型別 class MyClass { static public string printstring(int p1

tornado中非同步request使用

使用httpRequest太無腦了,太莽了,當希望使用非同步request時,首先引入AsyncHttprequest from tornado.httpclient import AsyncHTTPClient 將介面中的方法新增上tornado的協程符 @

C#中的委託入門到精通

委託和事件在 .NET Framework 中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸 C# 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡堵得慌,渾身不自在。本章中,我將由淺入深地講述什

C#中的委託和事件---通俗易懂

每一個初學C#的程式猿,在剛剛碰到委託和事件的概念時,估計都是望而卻步,茫然摸不到頭腦的。百度一搜,關於概念介紹的文章大把大把的,當然也不乏深入淺出的好文章。可看完這些文章,大多數新手,估計也只是信心滿滿的覺得自己看懂了,一旦要在自己的程式中用上委託和事件,就傻眼了,根本不知

淺談C#中的委託、事件與非同步

從剛接觸c#程式設計到現在,差不多快有一年的時間了。在學習過程中,有很多地方始終似是而非,直到最近才弄明白。 本文將先介紹用法,後評斷功能。 一、委託 基本用法: 1.宣告一個委託型別。委託就像是‘類'一樣,聲明瞭一種委託之後就可以建立多個具有此種特徵的委託。(特徵,指的是返回值、引數型

C#檔案同步工具教程

                我要介紹一下,用C#中FileSystemWatcher作檔案監測同步更新兩個不同目錄中檔案的小工具(A目錄中的1.txt發生改變時,B目錄中的1.txt也會自動改變以達到與A中的更新到相同的版本),讓更多的程式設計愛好者能更快的入門,<script type="text

C Thread與委託實現定時重新整理資料功能

                     使用者需求:定時抓取ERP系統條碼已掃描未稽核單據1解決辦法: 由於採用Timer控制元件會消耗系統資源,故採用執行緒處理。 由於執行緒呼叫方法不支援控制元件處理模式,故採用委託方法實現。       bool bStop;        public DataTab

記一次React中非同步獲取事件物件的爬坑經歷

SyntheticEvent objects are pooled 在使用React過程中,直接非同步獲取事件物件上的屬性,實際上我們拿到的值永遠是null,下面的程式碼就存在問題 const handleClick = e => { setTimeout(() => {