c# 异步怎么回调 5
展开全部
异步回调就是发起请求后,不等待响应就先去处理自己的响应,它不是处理整个请求,只是处理一小部分,在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等,有些异步是同一个线程完成的,有些异步是不同的线程,所以回调函数里要更新控件都会提示跨线程访问控件的错误提示。
该文章转自:站点基地
相对于同步就是必须等到响应该请求后才能做别的事,具体到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等,有些异步是同一个线程完成的,有些异步是不同的线程,所以回调函数里要更新控件都会提示跨线程访问控件的错误提示。
该文章转自:站点基地
2011-07-06
展开全部
把你的程序改成这样你就清楚了:
class Program
{
public delegate void takedelegate(int ms);
public static void takeMethod(int ms)
{
Thread.Sleep(ms);
}
static void Main(string[] args)
{
takedelegate dl = takeMethod;
IAsyncResult ar = dl.BeginInvoke(3000, takecompleted, new object[] );
//dl.EndInvoke(ar);
Console.WriteLine("开始执行");
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
if (ar.IsCompleted)
{
Console.WriteLine("执行完毕 ");
break;
}
}
Console.Read();
}
static void takecompleted(IAsyncResult ar)
{
object[] myObject = ar.AsyncState as object[];
Console.WriteLine(Environment.NewLine);
if(ar.IsCompleted)
Console.Write("In callback. The parameters lengh is " + myObject.Length);
Console.WriteLine(Environment.NewLine);
}
}
当调用BeginInvoke时,程序将启动一个新的线程去执行takeMethod()方法,并返回一个实现IAsyncResult接口的对象,该对象有两个重要的属性:AsyncState(object)跟IsCompleted(bool),前个属性的值正是BeginInvoke()方法第三个参数值为object对象(楼主的例子传的是自己本身),所以在Callback方法takecompleted()中,就能通过ar.AsyncState拿到这个参数对象,至于为什么是takecompleted(IAsyncResult ar)这样的格式,那就得去问M$。何时知道异步方法执行完了,那就得靠IsCompleted这个属性了,true是,false否.
注意takecompleted()和takeMethod()都是在异步线程里执行的,异步方法调用也实现了不同线程间传递数据哦。
Endinvoke()唯一的参数就是一个IAsyncResult对象,是由BeginInvoke()返回的,调用Endinvoke()时,会一直租塞当前线程,直到异步方法takeMethod()执行完,去掉注释代码运行看效果。
另外,团IDC网上有许多产品团购,便宜有口碑
class Program
{
public delegate void takedelegate(int ms);
public static void takeMethod(int ms)
{
Thread.Sleep(ms);
}
static void Main(string[] args)
{
takedelegate dl = takeMethod;
IAsyncResult ar = dl.BeginInvoke(3000, takecompleted, new object[] );
//dl.EndInvoke(ar);
Console.WriteLine("开始执行");
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
if (ar.IsCompleted)
{
Console.WriteLine("执行完毕 ");
break;
}
}
Console.Read();
}
static void takecompleted(IAsyncResult ar)
{
object[] myObject = ar.AsyncState as object[];
Console.WriteLine(Environment.NewLine);
if(ar.IsCompleted)
Console.Write("In callback. The parameters lengh is " + myObject.Length);
Console.WriteLine(Environment.NewLine);
}
}
当调用BeginInvoke时,程序将启动一个新的线程去执行takeMethod()方法,并返回一个实现IAsyncResult接口的对象,该对象有两个重要的属性:AsyncState(object)跟IsCompleted(bool),前个属性的值正是BeginInvoke()方法第三个参数值为object对象(楼主的例子传的是自己本身),所以在Callback方法takecompleted()中,就能通过ar.AsyncState拿到这个参数对象,至于为什么是takecompleted(IAsyncResult ar)这样的格式,那就得去问M$。何时知道异步方法执行完了,那就得靠IsCompleted这个属性了,true是,false否.
注意takecompleted()和takeMethod()都是在异步线程里执行的,异步方法调用也实现了不同线程间传递数据哦。
Endinvoke()唯一的参数就是一个IAsyncResult对象,是由BeginInvoke()返回的,调用Endinvoke()时,会一直租塞当前线程,直到异步方法takeMethod()执行完,去掉注释代码运行看效果。
另外,团IDC网上有许多产品团购,便宜有口碑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般是你把回调的方法代理传给调用函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你能把问题说的详细点嘛????
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询