非同步呼叫和多執行緒呼叫

2022-03-26 13:55:44 字數 2933 閱讀 1994

同步方法和非同步方法的區別

同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果;

非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作

現在新建乙個windows應用程式,然後放上乙個button1,寫入以下**:

c# code

private

void

button1_click(

object

sender, eventargs e)

private

void

bigfunc()

}

點選該按鈕後,發現程式卡死了很久才出現"finished"的字樣。

現在請使用委託與非同步呼叫的方法來解決此問題,讓程式不卡死,求具體**。

非同步處理

樓主是想把 bigfunc() 非同步執行吧

非同步模式常用的有 等待, 輪詢, **等方式。

執行**的begininvoke方法,會立既返回當前執行緒

呼叫endinvoke等待方法完成,阻塞當前執行緒 

等待模式 

方法**.begininvoke

可能這個方法執行的時間比較長,呼叫begininvoke後可以做一些其他工作,真到呼叫完成

方法**.endinvoke  

**執行完成.這裡方法沒執行完,阻塞當前執行緒

非同步**的非阻塞模式 方法**: 以樓主的**做例子

public delegate void mydelegate();  //新建無引數**

private void bigfunc() }

private void button1_click(object sender, eventargs e)

void onmethodcompletion(iasyncresult async)  //這個方法會在非同步執行完成後由系統呼叫

這個介面不阻塞,並不像10樓說的.不信試試

你當前這個例子 ,**方式最適合,就我給的例子。

非同步方法.begininvoke(...)

非同步方法.endinvoke(...)

...

這個和直接呼叫方法差不多, 因為呼叫  非同步方法.endinvoke,系統會等待 非同步方法執行完成,才會執行下面的方法。

非同步方法.begininvoke(...)

dosomething 這裡做點什麼  因為要非同步計算的方法可能耗時比較常,呼叫begininvoke以後在做點其他事

等你事情做完後,

非同步方法.endinvoke(...) 在呼叫endinvoke ,一直等到非同步執行完成才會執行下面的行. 也就是說中間做什麼事和你的異

步方法是同時進行的,只是呼叫endinvoke如果方法已執行完成,立既返回當前執行緒了,如果沒完成,繼續等待,這時就和同步

時的情況差不多,主線程一樣會鎖死。

輪循和這個差不多 ,只是儲存了乙個iasyncresult, 來查詢方法是否執行完成,只不過還可以輪循多個非同步**

** ,呼叫  非同步方法.begininvoke(引數,**方法),  後不用去管它,處理完成後由**方法傳送通知。

等待模式 就像是你找了個人去做事, 要等他做完了你才能做後面的事,當然,在他做事的時候你可以幹點別的,不過要等他幹完,你才能策底做完,這其間你雖然可以做別的,但是你也不知道你的事先做完還是他的事先做完,你先完成了就要等他.

輪循模式 找了個幾笨蛋去做事,  你也不知道他們什麼時候完成,於是,過一會問他們,你做完了嗎,你做完了嗎。。

**模式 這次找了個足夠聰明的人做事, 你只要告訴他做什麼,他會勤勤懇懇的的幫你完成,完成後會主動告訴你,boss,我的事做完啦,這是你要的處理結果,笑納。 你不用去管過程,放心做你的事,等著他來報告就行了

iasyncresult iasync = md.begininvoke(onmethodcompletion, null); //我理解為開始執行bigfunc()方法,但在此處宣告的iasyncresult iasync並賦值在這裡是起什麼作用  ,這裡的其實沒用,如果不是用**通知,那麼用它來查詢方法狀態

//此方法執行完bigfunc()方法後自動會被呼叫,所以叫**函式,呵呵。但是都結束了,還**一下做什麼呢?

非同步**實際上是放在系統執行緒池裡執行,iasyncresult就像乙個標籤,唯一標名乙個**方法。  begininvoke(onmethodcompletion... 這裡會傳引數iasyncresult給方法onmethodcompletion.

為什麼要**? 不**你就不知道他做沒做完,並且**是可以有返回值的,否則你就無法獲取到方法返回的值.

非同步方法進入執行緒池執行完畢後通知**方法,也就是呼叫onmethodcompletion

asyncresult asyncresult = (asyncresult)async;//這是幹什麼呢? 

這就像乙個簽名,記錄了**方法,查詢等  

mydelegate md = (mydelegate)asyncresult.asyncdelegate;//這又是幹什麼呢?  

這就是你一開始宣告的**  相當於前面設定了  asyncresult.asyncdelegate=md; 這裡在取出來

執行緒處理

namespace

threads

thread th,th2;

public

delegate

void

setdelegate();

private

void

button1_click(

object

sender, eventargs e)

private

void

fill()

}private

void

setbutton());}

else}}

}

JAVA多執行緒實現非同步呼叫

時間 只需要領個提貨單就可以了 去幹別的事情 等到蛋糕做好了,再拿提貨單取蛋糕就可以了。package com.somnus async description 顧客 date 2016年3月9日 下午7 20 41 version 1.0 public class customer catch i...

同步呼叫與非同步呼叫

一 什麼是同步呼叫與非同步呼叫 定義 1 同步就是整個處理過程順序執行,當各個過程都執行完畢,並返回結果。2 非同步呼叫則是只是傳送了呼叫的指令,呼叫者無需等待被呼叫的方法完全執行完畢 而是繼續執行下面的流程。例如,在某個呼叫中,需要順序呼叫 a,b,c三個過程方法 如他們都是同步呼叫,則需要將他們...

執行緒 委託的非同步呼叫

c programming p323 begininvoke 會立即返回,它將建立乙個另乙個執行緒來完成自己的工作。當我需要它執行後的結果時 例如 pubilc delegate in testdetegate pubilc testdetegate thedetegate thedetegate ...