c 之基礎委託非同步

2021-05-23 22:43:19 字數 2943 閱讀 8002

大家知道委託就相當於c++裡面的函式指標,相信大家都很很了解,看看如下簡單**來回想一下委託

public

delegate

void

ad();

xu xus

=new

xu();

ad b

=new

ad(xus.add);

b +=

xus.ex;

b();

console.readline();

class

xupublic

void

ex()}

這裡我們看見 定義了乙個add 的委託沒有引數沒有返回值 然後把委託指向add 和ex 兩個方法(多播委託) 然後執行b()  執行之後 結果大家應該知道 就是執行了這2個方法列印出 "ssssssssssssss"於"aaaaaaaaaaaaaaaa"。那如果變成下面這個形式呢?

public

delegate

intad(

intx,

inty);

static

void

main(

string

args)

;console.writeline(a(3,

2));

console.readline();

}static

intadd(

intx,

inty)

static

intex(

intx,

inty)}

這段** 也是執行乙個多播委託 但是輸出的結果會是什麼樣的呢 答案是 輸出1,為什麼前面那個委託會輸出2個方法 而這個委託只會輸出第二個方法的返回值?如果我們也想輸出2個返回值怎麼辦呢?其實很簡單 **如下

public

delegate

intad(

intx,

inty);

static

void

main(

string

args)

;delegate d

=a.getinvocationlist();

for (

inti =0

; i

<

d.length; i++)

}console.readline();

}static

intadd(

intx,

inty)

static

intex(

intx,

inty)}

這裡我們使用了乙個getinvocationlist 方法來返回多播委託的呼叫列表 然後轉化ad 然後迴圈呼叫 最後顯示的結果就是5,1。委託的 複習我們就看到這裡 現在回到正題 看看委託的非同步呼叫。

public

delegate

intad(

intx,

inty);

static

void

main(

string

args)

static

intadd(

intx,

inty)

執行這段** 會先停頓2秒鐘之後再顯示6 和start 因為我使用了sleep這個方法 它使該執行緒休眠2秒鐘,所以會在2秒之後顯示資訊,但是這對使用者體驗來說是非常糟糕的,那我們怎麼改善呢?看看如下**

public

delegate

intad(

intx,

inty);

static

void

main(

string

args)

int s

=a.endinvoke(isa);

console.writeline(s.tostring());

console.readline();

}static

intadd(

intx,

inty)

static

intex(

intx,

inty)

這裡我們使用了begininvoke方法來非同步執行 委託方法返回乙個iasyncresult 型別的值 代表委託執行的狀態,使用乙個while迴圈 來判斷iscompleted 如果沒有完成非同步呼叫則不斷顯示「未完成」 如果完成endinvoke 則返回結果。但是這裡需要不斷的詢問操作完成狀態 那麼我們怎樣讓委託非同步呼叫完成之後主動通知我們呢? 看看如下**

public

delegate

intad(

intx,

inty);

static

void

main(

string

args)

console.readline();

}static

void

call(iasyncresult isa)

, "

,a.endinvoke(isa),ar.asyncstate);

}static

intadd(

intx,

inty)

static

intex(

intx,

inty)}

這裡我們使用了乙個call方法 注意它是沒有返回值的。把iasyncresult轉換成asyncresult注意少了個i然後轉換成ad 型別的委託 最後endinvoke 來返回值 這樣在委託非同步執行完成之後會自動通知方法。呵呵 好了今天就說到這裡吧。如果有說的不對的地方歡迎指正 大家一起學習一起進步。

C 基礎之委託

委託常常和事件在一起使用,可以理解委託是方法的容器,事件則是委託的另一種表現形式。委託和事件雖然寫得還比較多,不過也只是用的熟練而已,趁週末沒課好好鞏固下基礎,一點一點積累吧。1.乙個簡單的小例子 class program class people public void eatpear stri...

C 基礎之委託

因為委託也是面試常常問道的問題,分享一下我的理解。為什麼使用委託。delegate void mydelegate 定義委託 mydelegate md 宣告委託 md new mydelegate obj.method 委託的例項化 mymethod d 把引數傳遞給方法 委託把方法當做引數傳到另...

c 委託非同步實現

同步執行模式,是指語句在同步執行模式下,將始終保持對程式流的控制,直至程式結束。例如查詢操作,客戶機上的應用程式在向伺服器發出查詢操作的指令後,將一直等待伺服器將查詢結果返回客戶機端後,才繼續進行下一步操作 非同步執行模式,是指語句在非同步執行模式下,各語句執行結束的順序與語句執行開始的順序並不一定...