网站建设资讯

NEWS

网站建设资讯

vb.net异步侦听 vbnet异步调用

vb.net 中的异步委托机制,最好有相关的详细资料讲解,我是新手

所谓的委托(Delegate)实际上就是和C/C++里面的函数指针差不多,只是增强了类型检查等其它健壮性方面的内容。异步调用的回调函数有格式要求,所谓格式要求就是参数数量及类型顺序的要求,具体是什么样的你要看文档了。一般.NET Framework里面都是AsyncCallBack。

创新互联服务项目包括勐海网站建设、勐海网站制作、勐海网页制作以及勐海网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,勐海网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到勐海省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

所谓异步编程,就是说你要求做某样事情,但是在完成这件事之前,我能接着做下一件事,而当这件事情完成之后,能够有一种机制通知我完成了。相反,在完成之前一直等待,直到完成了才能进行下一步操作,叫做同步。一般来说,我们平常写的程序都是“同步”,或者成为“顺序执行”更加贴切,而“异步”则可以说是“乱序执行”的。

可以看到,同步的代码非常好写,因为我们可以预测执行的顺序和情况。而异步就不是很好写了,因为无法得知完成的时候我正在做什么、做到什么程度。过去写这些代码是比较麻烦的,实现的办法就是自己建立一个处理异步事物的线程,然后在这个线程和主线程之间建立联系。而现在这个过程大部分已经被系统封装起来了,你只要调用BeginXXX,系统就会为你自动建立一个新的线程处理这个事情,当前线程不阻塞,可以马上进行下一项操作,于是就实现了“异步”了。但是从前面我讲道的你就应该知道,开始异步操作并没有完事,还需要能够得知操作完成,并能够进行相应的处理。于是你在调用BeginXXX的时候就需要传递一个回调函数,在.NET里是以委托的方式传递的。回调函数的意思就是“回过头来调用你”,或者说A调用B并且传递函数C的地址,于是B在指定的情况下调用A指定的函数C。现在就应该明白这个回调函数在BeginXXX中的作用就是,当你指定的事情做完之后将会调用这个回调函数。

在这个回调函数里面,我们就可以进行一些后续的工作,例如接着进行性质相同的工作,或者相应的处理。在这里,我们也许向知道刚才那件事情执行的情况和结果,这个时候我们就可以通过EndXXX来获得这些东西。说到这里,结合上面说到的AsyncCallBack以及随便哪个BeginXXX,我们可能会对下列两个东西感到困惑:

IAsyncResult

stateObject

首先说IAsyncResult,这个是一个接口,你在回调函数中通过参数获得的对象具体是什么类型的一般我们不需要关心,我们只需要依照这个接口的定义进行访问就可以了。简单点说,这个接口规定了顺利完成异步操作所需信息的最小集合。一般来说,我们需要通过这个参数(ar)来识别异步操作。比如说,你在一瞬间发起一百个“从不同的网络连接获取数据”的异步请求,当某一个请求被完成的时候,如何判断是那个请求被完成呢?就是依靠回调函数的参数ar。实际上你一般是不需要参与判断的,你只要将这个ar传递给EndXXX就可以了,EndXXX会根据这个ar自行判断的。需要注意的是,这个ar就是你调用BeginXXX的时候的返回值,可以说是一个存根,如果你需要在完成操作前终止他,也可以通过将这个存根传递给EndXXX,EndXXX就会根据情况终止操作。(IAsyncResult里面的IsCompleted提供了是否已经完成的判断,EndXXX就是根据这个值决定是否有必要终止。当然,你不需要关心他。)

接下来我们看看stateObject,这个东西被称为状态对象。于是大家就可能奇怪了:那个ar不也是状态吗?实际上stateObject是一个留给用户使用的东西,BeginXXX/EndXXX根本就不使用。这个stateObject会被装到ar的AsyncState里面,也就是说这个stateObject可以随时通过访问存根(BeginXXX的返回值)或者回调函数里的ar得到,你完全没必要额外的保存到什么地方,更不需要费神的去考虑如何和你的某个异步操作对应起来。说了半天,这个东西有什么用呢?你想怎么用就怎么用呗,发挥一下你的想象力。比如说,你可以保存这是第几次操作,或者在多个异步操作之间要同步的时候可以作为信号旗,再或者直接是操作这个异步操作的对象(x.BeginXXX的时候将x传递到stateObject参数上)。

第一种用法有点多余,第二种用法有点复杂,第三种我用得最多。因为你很可能在协一个服务端,而服务段必须能够响应多个客户端,这决定了必须用异步。同时,对于多个客户端必然有多个对象,例如网络连接的时候可能是Socket。而实际上处理的方法或者协议是和具体哪个客户端没有关联的,因此我们只需要一套处理程序就够了。这个时候第三种用法就很有用处,我们完全可以把代码写成这样:

Sub DataReceived(ByVal ar As IAsyncResult)

ar.AsyncState.EndReceive(ar)

ar.AsyncState.BeginReceive(... , ar.AsyncState)

End Sub

这样就不需要额外的数据结构去记录有那些正在活动的对象了。

VB如何实现异步执行?有哪几种方法?

在标准模块中写入以下代码:

Public Const SYNCHRONIZE = H100000

Public Const INFINITE = HFFFFFFFF

Public Const WAIT_TIMEOUT = H102

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

'Form中

Option Explicit

sub RunExe(FileName as string)

Dim pId As Long, pHnd As Long, ret

pId = Shell(FileName, vbNormalFocus)

pHnd = OpenProcess(SYNCHRONIZE, 0, pId)

If pHnd 0 Then

Do

ret = WaitForSingleObject(pHnd, 0)

DoEvents

Loop While ret = WAIT_TIMEOUT

CloseHandle pHnd

End If

End Sub

'用runexe代替shell函数,如runexe("a.bat")

谁能给个 vb.net 异步,多线程查询SQL数据实例。C/S程序的

1.配置SQLServer外围应用服务器,开启SQL2005远程连接功能:

操作方式如下,点击“配置工具”-“SQLServer外围应用配置器”,然后在打开的窗口中选择“服务和连接的外围应用配置器”-然后选择Database Engine节点下的 “远程连接”,选择“本地连接和远程连接”,同时选择“同时使用TCP/IP和named pipes”,确定后然后需要重新启动数据库服务就可以了。

2.把登陆设置改为SQLServer 和 Windows 身份验证模式,具体设置如下:

打开SQLServer Management Studio管理器,点击服务器上面右键然后查看属性,在安全性选项里面对服务身份验证选择“SQLServer 和 Windows 身份验证模式”。

vb.net中Socket问题

1.绑定的IP是服务器的IP地址,服务器是固定的,客户端连接的是一个已知的服务器端。

2.客户端的话,连接到服务器时,服务器accept后,就可以获得客户端的连接信息,包括IP地址和端口。

我是学C的,在C语言中,socket-bind-listen-accept-....,在accept函数中有选项,如下caddr结构体中就存有accept后客户端的IP地址 连接端口和传输方式等信息,clientsock[1]则为accept新的描述符,如你程序中soc2一样 。

clientsock[1] = accept(sfd,(struct sockaddr*)caddr,len);

VB中应该也有类时的函数,你网上好好找一下,或者看看相关书籍.

VB.NET Socket通信 回调函数里的数据无法显示到界面控件内

a+=1; 这条指令必须在dosomething()方法执行完毕返回结果后才可以执行,否则就乱了套

异步:异步概念和同步相对,当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者(百度上抄的)。理解了同步概念后异步也就不难理解了,以javascript的ajax为例

ajax(arg1,arg2,function(){

//回调函数

a=3;

});

a=4;

这个代码段执行完成后一般情况会把a赋值为3而不是4,因为在ajax方法调用后,a=4;这条语句并没有等待ajax()返回结果就执行了,也就是在ajax()执行完成调用回调函数之前,a=4;已经执行了,回调函数再把a赋值为3使之成为最后结果,为此在ajax调用中我们经常会使用回调函数,其实在很多异步处理中我们都会使用到回调函数。

阻塞

阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。

求深入浅出讲解VB.NET下利用Async和Await实现异步的方法。

run需要一个action方法。

这个方法用于用后台进程执行占用大量CPU的工作,你的for代码段应该写在里面。

我没用过这个,粗略看了一下资料,实际情况与他的实例不太一样,Dim a As Task(of Boolean)=Await Doo(),直接提示错误,正确用法是去掉await。

解决以上两个问题,测试运行通过。(一个文本框滚数字,另一个打字无压力)

其实你的要求,不需要这么高级。多线程应该可以。


当前名称:vb.net异步侦听 vbnet异步调用
分享路径:http://njwzjz.com/article/doospps.html