1. 程式人生 > >c#中使用委託操作執行緒

c#中使用委託操作執行緒

 使用委託的BeginInvoke和EndInvoke操作執行緒的步驟:

        1.例項化委託  

static CalculateMethod calculateMethod = new CalculateMethod(CalutateTwo); static PrintMethod printM = new PrintMethod(Print);
static PrintMethod printM = new PrintMethod(Print);

       2.呼叫委託的BeginInvoke方法 BeginInvoke(委託需要的引數,回撥方法(可為null),傳遞的物件(可為null))

          方法執行完後會返回 IAsyncResult 型別的結果 

IAsyncResult asyResult = printM.BeginInvoke("直接呼叫EndInvoke獲取返回值 ", null, null);

如果不呼叫EndInvoke方法,程式會立即退出,這是由於使用BeginInvoke建立的執行緒都是後臺執行緒,這種執行緒一但所有的前臺執行緒

都退出後(其中主執行緒就是一個前臺執行緒),不管後臺執行緒是否執行完畢,都會結束執行緒,並退出程式。

3.使用EndInvoke方法接收返回的結果

(1)直接使用EndInvoke方法獲取返回值

string result = printM.EndInvoke(asyResult);
            (2)使用IAsyncResult asyncResult屬性來判斷非同步呼叫是否完成

當後臺執行緒工作量巨大的時候,呼叫完BeginInvoke方法後,使用者要等待很久才會有反饋,會影響使用者互動體驗,這時我們可以用

asyncResult來判斷非同步呼叫是否結束,並顯示一些提示資訊,增加使用者體驗。

//模擬執行緒呼叫時間過長,手動設定執行緒阻塞2s
Thread.Sleep(2000);
IAsyncResult Iresult = printM.BeginInvoke("直接呼叫EndInvoke獲取返回值 ", PrintCallBack, null);
          
//IsCompleted 執行緒執行完畢時,IsCompleted為true 
 
while (!Iresult.IsCompleted)
{
Console.Write("*");
Thread.Sleep(1000);
}
string result = printM.EndInvoke(Iresult); 
Console.WriteLine(result);

          (3)使用回撥方法返回結果
//PrintCallBack為回撥函式,當執行緒執行完後會呼叫這個函式,可以在這個函式中接收返回的結果
printM.BeginInvoke("直接呼叫EndInvoke獲取返回值 ", PrintCallBack, null);
         
static void PrintCallBack(IAsyncResult Result)
{
Console.WriteLine(printM.EndInvoke(Result));
}

相關推薦

c#使用委託操作執行

 使用委託的BeginInvoke和EndInvoke操作執行緒的步驟:         1.例項化委託   static CalculateMethod calculateMethod = new CalculateMethod(CalutateTwo); stati

Unity之C#——非同步委託開啟執行,三種方法檢測結束

Unity之C#——非同步委託開啟執行緒,三種方法檢測結束 原始碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

用《捕魚達人》去理解C#的多執行

執行緒是程序中某個單一順序的控制流,是程式執行中的排程單位,是程式執行流的最小單位,一個標準的執行緒由執行緒ID,當前指令指標(PC),暫存器集合和堆疊組成。 執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。 執行緒也

c#的多執行異常處理

1.對於Thread操作的異常處理 public static void Main() {   try   {     new Thread (Go).Start();   }   catch (Exception ex)   {     // We'll never ge

C# 關閉當前執行的四種方式

從查MSDN和從網上查資料可以知道,Dispose()方法,雖然能釋放當前窗體的資源,卻不能強制結束迴圈, 要想強制突出當前程式要用:System.Environment.Exit(int exitcode)方法;該方法:終止當前程序併為基礎作業系統提供指定的退出程式碼。 如下則問題解決: private v

c++多個執行使用同一個函式

我是小白,最近在學習實現一個簡單的執行緒池,執行緒池中維護了一個存放執行緒的陣列以及一個任務佇列。在建立執行緒池(建構函式中)時建立若干個執行緒,起始時由於任務佇列中沒有任務,建立的每一個執行緒都處於阻塞狀態。使用pthread_create函式建立執行緒時把所有的執行緒與

C++四種執行同步的方法

現在流行的程序執行緒同步互斥的控制機制,其實是由最原始最基本的4種方法實現的。由這4種方法組合優化就有了.Net和Java下靈活多變的,程式設計簡便的執行緒程序控制手段。     這4種方法具體定義如下 在《作業系統教程》ISBN 7-5053-6193-7 一書中能夠找到

【收藏】C#的多執行——執行同步基礎

第二部分:執行緒同步基礎 同步要領 下面的表格列展了.NET對協調或同步執行緒動作的可用的工具: 簡易阻止方法 構成 目的 Sleep 阻止給定的時間週期 Join 等待另一個執行緒完成 鎖系統 構成 目的 跨程序?

C#的多執行執行死鎖

多執行緒(英語:multithreading),是指從軟體或者硬體上實現多個執行緒併發執行的技術。具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於一個執行緒,進而提升整體處理效能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多處理(Ch

C#的後臺執行

基本概念就不再多說,後臺執行緒和前臺執行緒的主要區別就是後臺執行緒不會防止程序的終止,這句話如何理解呢?下面用個例子來理解一下。      (閱讀時請注意執行緒和程序的區別)先來看一下開啟子執行緒的標準流程: public partial class Form1 : F

C#的多執行

在這一部分,我們討論 Framework 4.0 加入的多執行緒 API,它們可以充分利用多核處理器。 這些 API 可以統稱為 PFX(Parallel Framework,並行框架)。Parallel類與任務並行構造一起被稱為 T

C++的多執行

1.每個程序至少包含一個執行執行緒,稱之為主執行緒,再由主執行緒建立多個子執行緒。c++中沒有內建的多執行緒的支援, 是因為效率、控制以及c++適用的應用程式的範圍,但允許你直接使用作業系統提供的多執行緒支援。由於c++不跨平臺,所以如果有內建的多執行緒支援的話C++就只能

c#如何跨執行呼叫windows窗體控制元件?

我們在做winform應用的時候,大部分情況下都會碰到使用多執行緒控制介面上控制元件資訊的問題。然而我們並不能用傳統方法來做這個問題,下面我將詳細的介紹。 首先來看傳統方法: public partial class Form1 : Form { public Form1(

Objective-C的多執行之NSThread

使用NSThread有三種建立程序的方式:1) 建立一個新的程序,需要執行start才能啟動  NSThread *newThread = [NSThread alloc]initWithTarget:<#(nonnull id)#> selector:<#

c#委託與多執行的實質

delegate(委託)的概念,.Net的委託本質上就是指向函式的指標,只不過這種指標是經過封裝後型別安全的。委託和執行緒是兩個不同的概念,執行緒是動態的,委託就是一個或一組記憶體地址,是靜態的。執行緒執行時如果遇到了指向函式的指標就執行這個函式。.Net為了方便程式設計,給委託賦予了兩種方式以供呼

invoke委託解決“執行操作無效: 從不是建立控制元件的執行訪問它”的問題

###1.問題描述 線上程中更改控制元件屬性時,編譯器報錯:“執行緒間操作無效: 從不是建立控制元件的執行緒訪問它”。檢視資料後得知這個問題的根本在於,建立新執行緒後,新執行緒跟主執行緒同步執行,這時如果新執行緒提出對控制元件進行修改,將被編譯器報錯,因為可能會出現主執行緒跟新執行緒同時

C++11的多執行

C++標準庫的多執行緒使用, 示例程式碼如下: #include<iostream> #include<thread> //C++11 //#include<exc

C# 定時關窗 & 跨執行操作視窗

新增定時器 直接在程式碼中new一個定時器並繫結回撥函式即可 跨執行緒關閉其他視窗 會報異常: 解決方法: 在你要操作的視窗的類的建構函式中指明允許跨執行緒操作。 public partia

[C#]獲得執行活動的執行

轉自:http://blog.csdn.net/much0726/article/details/3846856 在C#中的執行緒池ThreadPool沒有獲得執行緒池中的活動執行緒數量的屬性或者是方法,但是有一兩個 方法可以幫助獲得活動執行緒數。 這兩個方法分別是:GetMaxThreads和GetAva

C/C++開發】多執行程式設計的join函式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # codi