c#之UDP异步发送,回调函数怎么写?

作者&投稿:策园 (若有异议请与网页底部的电邮联系)
异步回调函数~

回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自已定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系
当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!

Windows 系统还包含着另一种更为广泛的回调机制,即消息机制。消息本是 Windows 的基本控制手段,是一种变相的函数调用。发送消息的目的是通知收方运行一段预先准备好的代码,相当于调用一个函数。消息所附带的 WParam 和 LParam 相当于函数的参数,应用程序可以主动发送消息,更多情况下是坐等 Windows 发送消息。一旦消息进入所属消息队列,便检感兴趣的那些,跳转去执行相应的消息处理代码。操作系统本是为应用程序服务,由应用程序来调用。而应用程序一旦启动,却要反过来等待操作系统的调用。这分明也是一种回调,或者说是一种广义回调。其实,应用程序之间也可以形成这种回调。假如进程 B 收到进程 A 发来的消息,启动了一段代码,其中又向进程 A 发送消息,这就形成了回调。这种回调比较隐蔽,弄不好会搞成递归调用,若缺少终止条件,将会循环不已,直至把程序搞垮。利用消息也可以构成狭义回调。把回调函数地址换成窗口 handle。如此,当需要比较数据大小时,不是去调用回调函数,而是借 API 函数 SendMessage 向指定窗口发送消息。收到消息方负责比较数据大小,把比较结果通过消息本身的返回值传给消息发送方。所实现的功能与回调函数并无不同。当然,此例中改为消息纯属画蛇添脚,反倒把程序搞得很慢。但其他情况下并非总是如此,特别是需要异步调用时,发送消息是一种不错的选择。假如回调函数中包含文件处理之类的低速处理,调用方等不得,需要把同步调用改为异步调用,去启动一个单独的线程,然后马上执行后续代码,其余的事让线程慢慢去做。一个替代办法是借 API 函数 PostMessage 发送一个异步消息,然后立即执行后续代码。这要比自己搞个线程省事许多,而且更安全。

回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。 其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

其实回调函数 你可以看做在两个不同线程。
当你回调时,开启了另外一个线程执行Connected。
所以如果在Connected中出错时。
会在另一个线程抛出

如果你想捕获的话Connected
必须有将错误的回传的机制

就是说如果
函数里throw了一个异常
就将异常回传给主线程

使用delegate委托可能可以实现您的要求

soket.completed+=new XXXXX(hdhs());
private void hdhs(eventarges e,object sender)
{
string s = e.xxxx;
}


盘县17737374534: c#之UDP异步发送,回调函数怎么写? -
苏畏复方: soket.completed+=new XXXXX(hdhs()); private void hdhs(eventarges e,object sender) { string s = e.xxxx; }

盘县17737374534: c#异步通信中回调函数AsyncCallback如何传递参数 -
苏畏复方: 写一个类,将你要的参数都封装进去.然后通过IAsyncResult.AsyncState进行传递.// 1)定义类,封装你要的任何东西 class StateObject { public Scoekt frd{get;set;} pubic ComboBox combo{get;set;} //可以添加任何你需要的东西 //…… }// 2)在...

盘县17737374534: C#..什么是异步回调? -
苏畏复方: 异步回调就是发起请求后,不等待响应就先去处理自己的响应,它不是处理整个请求,只是处理一小部分,在Web页上就表现为页面没刷新,却局部更新了数据.相对于同步就是必须等到响应该请求后才能做别的事,具体到Web页就是整个页面...

盘县17737374534: C#如何将回调函数插入到主线程 -
苏畏复方: 可以通过线程池ThreadPool来解决,使用ThreadPool.QueueUserWorkItem(回调函数,object),将参数封装在一个类的对象中,传给回调函数去执行.TheadPool的用法:1、创建一个ManualResetEvent的对象,就像一个信号灯,指示线程的...

盘县17737374534: C# 线程池的线程能实现异步回调吗? -
苏畏复方: 可以的!! 你需要把你要回调的函数委托在创建线程的时候传递进去就可以了!! 使用beginInvoke 方法实现异步回调!!

盘县17737374534: c# 网络编程UDP循环接收程序应该怎么编写 -
苏畏复方: 我不知道你为什么只能接收一次- - 而且我也不知道你的代码是同步执行还是异步执行的..在窗体上执行服务器程序 如果想不阻塞UI线程的话 需要自己写异步或者多线程的代码执行...如果是多线程的话 只要简单的新建一个线程 在里面执行while(true){tcpClient.Receive(..)}就能达到目的 如果是异步的话 需要你在每次在回调函数中再执行一次BeginReceive就达成循环的目的了 但是这种编程思路 一般人很难理解

盘县17737374534: C# 创建一个线程,每秒用udp发送一次数据.代码怎么写? -
苏畏复方: public class Class1 { bool sending = true; public void Send() { var t = new System.Threading.Thread(new System.Threading.ThreadStart(()=> { using (var udpClient = new System.Net.Sockets.UdpClient()) { while (sending) { udpClient.Connect("...

盘县17737374534: C#.NET中的异步回调 -
苏畏复方: 如果你是使用委托进行异步编程的话:首先你要定义一个委托,该委托于你需要异步执行的方法的签名一定要一样,另外 在定义委托时,还可以加上两个可选的参数 意思就是说 你的方法签名 public string TestMethod(int i) 你的委托这样 public ...

盘县17737374534: methodinvoker?c#回调函数简单例子?wpfmeth?
苏畏复方: 你是否正在寻找关于methodinvoker的内容?让我把最完整的东西奉献给你:谈.Net委托与线程——创建无阻塞的异步调用(一)前言本文大部分内容来自于mikeperetz的...

盘县17737374534: 讲解如何实现C#回调函数 -
苏畏复方: 什么是C#回调函数? C#回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件.应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数.回调函数必须遵...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网