導航:首頁 > 廢水知識 > 委託中的回調函數怎麼用

委託中的回調函數怎麼用

發布時間:2021-02-23 01:01:04

A. 委託為什麼叫回調

回調(callback)函數復是Windows編程的一個重要部制分。如果您具備C或C++編程背景,應該就曾在許多Windows API中使用過回調。Visual Basic添加了AddressOf關鍵字後,開發人員就可以利用以前一度受到限制的API了。回調函數實際上是方法調用的指針,也稱為函數指針,是一個非常強大的編程特性。.NET以委託的形式實現了函數指針的概念。它們的特殊之處是,與C函數指針不同,.NET委託是類型安全的。這說明,C中的函數指針只不過是一個指向存儲單元的指針,我們無法說出這個指針實際指向什麼,像參數和返回類型等就更無從知曉了。如本章所述,.NET把委託作為一種類型安全的操作。本章後面將學習.NET如何將委託用作實現事件的方式。

詳情咨詢
http://book.csdn.net/bookfiles/829/

B. c#中委託怎麼用

委託主要用於.NET Framework中的事件處理程序和回調函數,它是事件的基礎。

委託的作用類似於c++中函數指針的作用。不同的是,委託實例獨立於它所封裝的方法的類,並且方法類型與委託的類型是兼容的。函數指針只能引用靜態函數,而委託可以應用靜態和實例方法。

所有委託都是繼承自System.Delegate類,並且有一個調用列表。調用委託時所執行的方法都被存放在這樣的一個連接列表中。

使用delegate關鍵字可以聲明一個委託。通過將委託與命名方法或匿名方法關聯,可以對委託進行實例化。為了與命名方法一起使用,委託必須用具有可接受簽名的方法進行實例化。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
//聲明一個委託
delegate int Mydelegate();

class Program
{
static void Main(string[] args)
{
test p = new test();
//將委託指向非靜態方法
Mydelegate m = new Mydelegate(p.InstanceMethod);
//調用非靜態方法
m();

//將委託指向靜態方法
m = new Mydelegate(test.StaticMethod);
//調用靜態方法
m();

Console.Read();
}
}

public class test
{
public int InstanceMethod()
{
Console.WriteLine("正在調用非靜態方法InstanceMethod()....");
return 0;
}

static public int StaticMethod()
{
Console.WriteLine("正在調用靜態方法StaticMethod()。。。。");
return 0;
}
}
}

C. 請教C#回調函數的調用問題

其實在C#語言中,如果不考慮unsafe編程的情況下,C#已經不存在指針了!但是有一種情況很特殊——我們需要實現將一個成員方法(函數是不規則的稱呼,面向對象中只有成員方法,沒有函數的概念了)做為一個參數傳入到另一個方法。
當然,在C/CPP中我們存在指針,把函數(或成員方法,面向過程語言或支持面向過程語言中存在函數或過程的概念)指針做為參數傳遞即可——這是一種典型的「傳址」引用的方式,在C#沒有指針的情況下想完成一個傳址引用,ref/out只能傳遞參數變數,並不能將方法轉換成地址傳入另一個方法的參數(方法參數化),怎麼辦——委託!
其實說白了,委託就是一種特殊的「代理」形式,把一個成員方法代理成一個變數(delegate變數),可以直接進行調用(根據委託形式,可以找到委託中代理的具體成員方法)!
回調就是一個委託的特殊形式,如果說委託著重於說明「代理」調用的話,而回調則是著重說明成員方法的參數化(指針特性)。
很多個認為一個完整的委託是要有委託(delegate聲明)和代理的方法(真正執行的方法),然後要求其形式完全一致,但是,由於C#語法糖的存在,我們還種一種特殊形式的委託——匿名委託!很多人很奇怪,為什麼方法名參做為一個參數呢?其實就是匿名委託,傳入並非方法名,而是方法名的匿名委託(委託沒有名字,所以只需要傳入方法名即可)!
不要以為你回調函數你傳入的是方法名——因為匿名委託的原因,這個方法名被自動包裝成了一個沒有名字的委託!看起來是傳入方法名——其實原理根本不是那麼回事!
當然即使你理解成方法名也可以,但只是一種錯誤的理解。因為他與常規的委託著重點不同,委託著重於代理執行,用於編譯時確認成員方法。而回調則是運行時確定成員方法,著重於指針形式,所以匿名委託足以使用,能讓你更容易理解回調函數(好象是被調用對象在執行期間又重新調用了調用對象的某個方法,所以叫回調——執行緒再次調用主體成員方法——就是A對象調用了B對象的BMethod方法,而BMethod方法需要再調用A對象的某個成員方法AMethod,那麼傳入Amethod方法的匿名委託就是回調,當然如果C對象是A對象的一個屬性或成員時,調用C對象的方法也是回調——A的某個對象屬性的成員方法)
回調如果你把CallBack參數當做一個成員方法時,那麼,回調方法的理解也會變得超簡單。

D. 請問委託非同步回調函數是否可以獲得執行後的內容(跨項目)

static void process_Callback(IAsyncResult result)
{
int value = Convert.ToInt32(ar.AsyncState);
AsyncResult aResult = (AsyncResult)ar;
putNewWeibo temp = (putNewWeibo)aResult.AsyncDelegate;
int result = temp.EndInvoke(ar);
}

E. 舉例:關於回調函數(callback function)格式參數

回調函數其實是一種委託,所以沒有必然的規定,創建一個符合指定的委託的函數,然後由這個函數創建回調所指定的委託作為參數就可以了。

要具體的解釋的話,請樓主指明應用的場合吧。

--------------------------------------------
那個是事件,不過也是委託的一種。回調其實用的也是委託。

比如,button的Click事件引發時,它要求的是一個 EventHandler 的定義,其實這里的 EventHandler 就是一個委託是定義。它的定義格式是
void EventHanlder(object sender,EventArgs e)

這就約定了Button的Click事件的處理程序的標准格式了,也就是用來處理這個事件的函數必須符合這樣的參數和返回條件。
當Button控制項決定要引發這個事件的時候,它就不用去考慮具體來接收這個事件的函數是怎麼實現、是什麼參數類型了,因為在它看來,Click事件的處理函數都符合EventHandler這個委託的定義(實際上都已經是EventHandler這個委託的實例了),所以它便直接Invoke調用即可,不需要再去考慮其它因素。

事實上,如果不用委託,那麼事件是無法實現的,因為作為調用方,沒有它已知的公用約束的話,它是無法預知它所要調用的處理函數的參數和返回值,在一定程度上說這樣的調用是無法實現的。

給樓主一篇博文參考:
http://www.cnblogs.com/birdshover/archive/2008/01/07/1029471.html

F. 如何實現DLL裡面的回調函數

  1. 在進一步執行實現前,請查看 EnumWindows 函數的簽名。 EnumWindows 具有以下簽名:

  2. BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

  3. 此函數需要回調的線索之一是存在 lpEnumFunc 參數。 經常可以看到在採用指向回調函數的指針的參數名稱中 lp(長指針)前綴與 Func 後綴結合在一起。 有關 Win32 函數的文檔,請參閱 Microsoft Platform SDK。

  4. 創建託管回調函數。 此示例聲明一個名為 CallBack 的委託類型,該類型採用兩個參數(hwnd 和 lparam)。 第一個參數是窗口的句柄;第二個參數是應用程序定義的。 在此版本中,這兩個參數都必須是整數。

  5. 回調函數通常返回非零值來指示成功,返回零值來指示失敗。 此示例將返回值顯式設置為 true 以繼續進行枚舉。

  6. 創建一個委託,並將其作為參數傳遞到 EnumWindows 函數。 平台調用自動將該委託轉換為常見的回調格式。

  7. 確保在回調函數完成其工作之前,垃圾回收器不會回收委託。 當將委託作為參數傳遞,或傳遞作為欄位包括到結構中的委託時,在調用期間不會對其進行回收。 因此,正如下面的枚舉示例一樣,調用返回並不再需要託管調用方執行任何其他操作之前,回調函數完成其工作。

G. 委託,事件和回調函數這3者之間到底是什麼關

這是因為你的回調委託作用域問題。在回調時,委託已經被回收了 所謂成員變版量: class test{ public delegate a; public void foo(){ private delegate b; } } 像這種情況權,b委託的作用域只在foo()函數裡面,如果你讓b被非託管代碼回調,當foo執行完後,非託管代碼回調時很可能b已被回收了。所以出現這個錯。 a委託是test類的成員變數,它是可以一直保持的,除非你對test進行了析構。 也可以使用static的變數。 也就是說,盡量擴大你的委託的作用域,保證在回調是它不會被自動回收就行了。

H. 問c# 委託非同步調用的回調函數問題

這個來我查的資料。《CLR Via c#》3描述是,當自BeginInvoke調用完成以後,方法會被放進隊列,CLR線程池會激活一個線程,來調用方法,方法執行完畢以後,如果沒有回調函數,線程會直接返回到線程池裡,但是存在回調函數,這個線程會繼續調用回調函數。 所以 我覺得是調用你實際方法的CLR上的線程。

I. C#中委託如何使用

1.委託概述
委託是C#中新加入的一個類型,可以把它想作一個和Class類似的一種類型,和使用類相似,使用一個委託時,需要兩個步驟,首先你要定義一個委託,就像是定義一個類一樣;然後,你可以創建一個或多個該委託的實例。
定義一個委託的語法是這樣的:
[public/protected/private] delegate returnType delegateName(paramtype param1,…)
這是我自己寫的,看起來好像有點怪怪的,我來解釋一下,private/protected/private是限定詞,就不多說了,delegate是申明一個委託的關鍵詞,returnType是一個返回類型,delegateName是一個你給委託起的名字,你可以寫任何一個你喜歡的名字,paramtype param1…這個是參數列表。說了這么多可能看起來還是不是很好理解,我是這樣認為的,實用點來講,委託定義就是在一個函數定義中間加入一個delegate的關鍵詞。它的作用類似於你申明一個類:
public class ClassName {…}
創建一個委託的實例:
[public/protected/private] delegateName deleInstanceName = new delegateName(MethodName)
這個類似於實例化一個類,public ClassName instancename = new ClassName(…),這里有個要注意的地方,即MethodName方法要和delegateName的簽名一致。什麼是簽名一致,就是說MethodName的參數列表,返回值要分別和returnType、(paramtype param1,…)一致。舉個例子來說明下:
public delegate string DelegateDemo(string name, int age);
比如我們如上定義了一個委託,就寫法來說,其實就是在函數 string DelegateDemo(string name, int age)前面加了一個delegate的關鍵字,下面我們來用創建一個函數:
public string AgentDemo(string name, int age)
{
string rev = 「」;

return rev;
}
這個函數是做參數傳遞給一個DelegateDemo實例的,接下來創建一個DelegateDemo的實例:
DelegateName instanceDemo = new DelegateName(AgentDemo);
這時要說到一致了,即AgentDemo和聲明委託時的DelegateDemo(我們姑且將delegate去掉)這兩個函數的返回值,參數列表要相同。終於說完了,不知道看的人明不明白。
接下來,我們可以使用這個委託了(調用一個委託),如下:
string name = 「cshape」;
int age = 20;
instanceDemo(name, age);
當instanceDemo執行時,會執行AgentDemo函數,instanceDemo相當於C里的一個函數指針,現在這個指針指向AgentDemo的函數入口地址。
2.多點委託
前面提到的委託都只包含對一個方法的調用,如果需要調用多個方法,需要多次顯示的調用這個委託,我們還有另的選擇,我們可以讓一個委託中包含多個方法,這樣我們一次顯示調用委託,就可以按照順序連續的調用多個方法。看下面的例子:
public delegate void MultiDelegate(string name);
public void AgentDemo1(string str)
{
Console.WriteLine(str + 「this is AgentDemo1\n」);
}

public void AgentDemo2(string s)
{
Console.WriteLine(s + 「this is AgentDemo2\n」);
}

MultiDelegate multiDemo = new MultiDelegate(AgentDemo1);
multiDemo += new MultiDelegate(AgentDemo2);
multiDemo(「multiDemo test :」);

輸出的結果應該是:
multiDemo test :this is AgentDemo1
mutliDemo test :this is AgentDemo2

可以看到我們一次顯示的調用一個委託,它順序的(按照你添加方法的順序)執行了方法AgentDemo1和AgentDemo2。這里要注意的有幾點:
● 委託支持 +=,-=這樣的運算符,對應為添加或去掉一個方法
● 多點委託不可以定義有返回值,因為無法處理多個方法的返回值,所以如果要使用多點委託,應該用void,否則你的編譯會返回一個錯誤
● 多點委託不建議你的參數列表中有OUT的類型,這樣只會out最後一個方法的值,其他的值會丟失。
3.委託的理解
首先申明,這只是我舉的一個例子,目的是幫助理解委託的過程,其中很多地方都經不起推敲,望大家知悉。言歸正傳,
你想要吃飯,
但是自己又不會做(委託方不知道實現細節),
你計劃找個飯店,叫個回鍋肉飯(定義了一個委託)
你決定找常去的那家叫做A的飯店(實例化一個委託)
你打電話給A飯店(委託調用)
A飯店給你做好了你的回鍋肉飯(代理函數工作)
飯來了,真好。

4.委託的使用時機
當你需要把一個方法傳送給其他方法時,可以考慮使用委託。好像不是很好理解,也可以這樣說,當你確定要處理一件事,但又不能確定處理方法時,可以考慮用委託。其實單獨的說委託的應用好像有點牽強,委託更多的是在事件中的應用。
5.一個委託的例子
我用兩個類來做這個例子,一個類,我稱它為委託方,一個類我稱它為代理方,代碼如下:
using System;

namespace Visen.Demo.Delegate
{
///<summary>
/// StartUp 委託演示中的程序入口,含委託方。
///</summary>
class StartUp
{
#region公用的方法

#region應用程序的主入口點。
///<summary>
///應用程序的主入口點。
///</summary>
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("This is a delegate demo\n");

Visen.Demo.Delegate.Agent ag = new Agent();

//定義一個委託類型的對象
OutMessage singleDele = new OutMessage(ag.ShowMessage);
OutMessage deleStaticMeth = new OutMessage(Agent.SShowMessage);

//定義一個多點委託
OutMessage MultiDele = new OutMessage(ag.ShowMessage);
MultiDele += new OutMessage(Agent.SShowMessage);

singleDele(" delegate instance singleDele");
deleStaticMeth(" delegate instance deleStaticMeth");
MultiDele(" this is a MultiDele");
Console.Read();
}
#endregion應用程序的主入口點。

#endregion公用的方法

#region私用的欄位
///<summary>
///定義一個委託類型
///</summary>
private delegate void OutMessage(string msg);
#endregion私有的欄位
}
}

下面是代理方:
using System;

namespace Visen.Demo.Delegate
{
///<summary>
/// Agent 類為委託者的代理方,處理委託者委託的事務。
///</summary>
public class Agent
{
#region公用的方法

#region空的構造函數
///<summary>
///空的構造函數
///</summary>
public Agent()
{
}
#endregion空的構造函數

#region顯示一條信息到控制台,一個類成員函數作為代理方
///<summary>
///顯示一條信息到控制台,一個類成員函數作為代理方
///</summary>
///<param name="msg">顯示內容</param>
public void ShowMessage(string msg)
{
Console.WriteLine("Method ShowMessage out:" + msg + "\n");
}
#endregion顯示一條信息到控制台,一個類成員函數作為代理方

#region顯示一條信息到控制台,一個類靜態函數作為代理方
///<summary>
///顯示一條信息到控制台,一個類靜態函數作為代理方
///</summary>
///<param name="msg">顯示信息</param>
public static void SShowMessage(string msg)
{
Console.WriteLine("static Method SShowMessage out:" + msg + "\n");
}
#endregion顯示一條信息到控制台,一個類靜態函數作為代理方

#endregion公用的方法
}
}
輸出為:
This is a delegate demo

Method ShowMessage out: delegate instance singleDele

static Method SShowMessage out: delegate instance deleStaticMeth

Method ShowMessage out: this is a MultiDele

static Method SShowMessage out: this is a MultiDele

可見:方法函數可以是類成員函數,也可以是一個靜態成員,只要和委託的簽名相同就可以了。

有錯的地方,請大家批評指正,謝謝!

J. 誰幫我寫個C# delegate回調函數的例子,謝謝了

首先創建一個很簡單的委託~
public delegate void DoIt(string str);
然後創建一個委託引用~

public DoIt _DoIt;

之後就是在你程序需專要觸發回調函數的屬地方去執行這個委託~

if (_DoIt != null) //執行委託需要判斷是否為空,如果沒有將對應簽名的方法存入委託,直接執行會報錯
{
_DoIt("測試");
}
最後就是去為委託添加回調方法,簽名必須一樣~
_DoIt = (str) => //這里是一個匿名函數,當然也可以直接傳方法
{
//這里就是委託觸發時執行的代碼

};
唔~看不懂請追問~
希望對您有幫助~
By Billskate

閱讀全文

與委託中的回調函數怎麼用相關的資料

熱點內容
排入一般景觀要求水域的污水 瀏覽:253
污水處理廠結構類型怎麼寫 瀏覽:228
供應含溴廢水 瀏覽:580
上海切削液廢水如何處理 瀏覽:34
納透凈濾和水器 瀏覽:306
飲水機為什麼會有細菌 瀏覽:512
愛屋安磁離子凈化器怎麼樣 瀏覽:819
蒸餾水和礦泉水的區別試驗 瀏覽:201
路由器mac地址過濾32個 瀏覽:706
倚瀾凈水機的開口板子是多少錢 瀏覽:984
富亞凈水器質量怎麼樣 瀏覽:780
熱水壺水垢用醋怎麼去 瀏覽:968
deae52是陰離子交換樹脂 瀏覽:18
污水處理錐形如何澆築 瀏覽:912
edi證可以過戶么 瀏覽:959
合肥市污水綜合排放標准 瀏覽:385
前置凈水器的下水如何處理 瀏覽:759
100多元的超濾水器有用嗎效果 瀏覽:486
什麼叫反滲透流程式控制制 瀏覽:179
進氣濾芯不好有什麼影響 瀏覽:173