您的位置:首页 > 其它

同步,异步,回调例子

2014-05-08 22:52 369 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace ConsoleApplication1
{
class Program
{
public delegate int AddDelegate(int op1, int op2);//声明AddDelegate委托

/// <summary>
/// 异步调用
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
YiBu();
Console.ReadLine();
}

#region 同步
/// <summary>
/// 同步调用
/// </summary>
/// <param name="args"></param>
static void TongBu()
{
AddDelegate addDelegate = new AddDelegate(delegate(int a, int b)
{
Thread.Sleep(5000);
return a + b;
});

int result = addDelegate.Invoke(1, 2);
//调用Invoke之后会在此处阻塞,后面的代码需要上面的代码执行完之后才能执行,这就是同步调用的坏处:用户体验不好。
Console.WriteLine("此内容只能等到上面的方法执行完之后才会到这里!");
Console.WriteLine(result);
}
#endregion

#region 异步
/// <summary>
/// 异步调用
/// </summary>
/// <param name="args"></param>
static void YiBu()
{
AddDelegate addDelegate = new AddDelegate(delegate(int a, int b)
{
Thread.Sleep(5000);
return a + b;
});

IAsyncResult result = addDelegate.BeginInvoke(1, 2, null, null);//此处是两个null
Console.WriteLine("eee");
int m = addDelegate.EndInvoke(result);
//异步在调用EndInvoke后会被阻塞,后面的代码也需要等待上面的代码执行完之后才能执行。
Console.WriteLine("此结果需要上面的代码执行完之后才会出来:" + m);
}
#endregion

#region 回调
static void HuiDiao()
{
AddDelegate addDelegate = new AddDelegate(delegate(int a, int b)
{
Thread.Sleep(5000);
return a + b;
});
AsyncCallback callBack = new AsyncCallback(AddComplete);
IAsyncResult result = addDelegate.BeginInvoke(1, 2, callBack, "111111111");
Console.WriteLine("此段会直接输出来。不用等待上面代码执行完。此种方式,用户体验号。");
}
static void AddComplete(IAsyncResult result)
{
AddDelegate handler = (AddDelegate)((AsyncResult)result).AsyncDelegate;
Console.WriteLine(handler.EndInvoke(result));
Console.WriteLine(result.AsyncState);
}
#endregion
}
}


相关文献:http://hi.baidu.com/smithallen/item/b1895d3779945cf02784f4b1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: