A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 霍世勇 中级黑马   /  2012-4-9 10:15  /  2418 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本人初学者,请问什么时候需要跨线程访问,还有异步回调是怎么实现的?求高手解答……

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
 线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
所以,在程序一个线程无法或者无法更好的完成不同工作时,使用跨线程


异步回调
异一个委托,该委托于你需要异步执行的方法的签名一定要一样,
另外 在定义委托时,还可以加上两个可选的参数
意思就是说
你的方法签名  public string TestMethod(int i)
你的委托这样 public delegate string AsyncMethod(int i);
在程序里面,你可以这样用
实例化你的委托:
// ad.TestMethod  假设TestMethod方法包含在一个ad的对象中


AsyncMethod caller = new AsyncMethod(ad.TestMethod);
IAsyncResult Result = caller.BeginInvoke(1,null/*回调*/,new StateObject() /*StateObject是你的对象*/);

这个你调用会返回IAsyncResult 对象 在上面 就是Result
你可以这样获得你的对象
Result.AsyncState 但是必须强制转换。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
异步回调就是发起请求后,不等待响应就去先干别的事,相对于同步就是必须等到响应该请求后才能做别的事。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
异步回调就是发起请求后,不等待响应就先去处理自己的响应,它不是处理整个请求,只是处理一小部分,在Web页上就表现为页面没刷新,却局部更新了数据。
相对于同步就是必须等到响应该请求后才能做别的事,具体到Web页就是整个页面刷新了,数据才更新。
下面举两个列子:
首先举个同步调用的例子:

比如你的程序调用了一个方法,这个方法要执行很长很长时间,而且这个时间都不确定,传统的办法就是“同步调用”,如下:

private int Func()
{
// 这个方法要执行很长时间,并且返回一个int的值。
}

private void A()
{
int n = Func();
textBox1.Text = n.ToString();
// 这里得到的n就是Func执行出来的结果,并且显示在textBox1中。
}

采用上述方法,可以叫做同步调用,很明显它有一个缺点:
Func方法执行的时间过长,程序会阻塞,并且无法继续执行其他的代码,给用户的体验就是整个程序都会僵着,打开任务管理器会提示该程序没有响应,用户以为程序死了,就会手动结束这个程序,









而异步调用就不一样,在调用完Func这个方法后,不必等待Func执行完,就可以执行其他的代码,直到Func执行完,才把结果返回,
如果Func提供了异步方法FuncAsync(),就可以这样调用:

private void A()
{
FuncAsync();
// 这里执行FuncAsync方法,并不会阻塞,程序会在后台执行完FuncAsync方法后,自动调用FuncCompleted方法,并且把结果传过去。
}

private void FuncCompleted(int n)
{
textBox1.Text = n.ToString();
// 参数n就是异步回调返回的结果,
}





异步回调需要编写代码才能支持,网络传输方面的类库一般都提供异步方法,如socket编程,web服务,ajax,wcf等,有些异步是同一个线程完成的,有些异步是不同的线程,所以回调函数里要更新控件都会提示跨线程访问控件的错误提示。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
让人一见面就问你看过某某好帖没有的好帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马