C#多线程之异步回调
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
namespace yibu
{
public delegate int AddHandler(int a,int b);
public class CAdd
{
public static int Add(int a, int b)
{
Console.WriteLine("开始计算...");
Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(4000);
Console.WriteLine("计算完成");
return a + b;
}
}
class Program
{
void cleanup(int result)
{
Console.WriteLine("调⽤者继续⼯作");
Console.WriteLine(result);
Console.ReadKey();
}
static void sync_call()
{
Console.WriteLine("Sync_call_test");
AddHandler handler = new AddHandler(CAdd.Add);
int result = handler.Invoke(1, 2);
Console.WriteLine("调⽤者继续⼯作");
Console.WriteLine(result);
Console.ReadKey();
}
static void async_call()
{
Console.WriteLine("Async_call_test");
AddHandler handler = new AddHandler(CAdd.Add);
IAsyncResult result = handler.BeginInvoke(1, 2, null, null);
Console.WriteLine("调⽤者继续⼯作");
Console.WriteLine(handler.EndInvoke(result));
Console.ReadKey();
}
static void async_callback()
writeline函数{
Console.WriteLine("Async_callback_test");
AddHandler handler = new AddHandler(CAdd.Add);
IAsyncResult result = handler.BeginInvoke(1, 2, new AsyncCallback(mycall), "AsyncState:OK"); Console.WriteLine("调⽤者继续⼯作");
//Console.ReadKey();
}
static void Main()
{
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
async_callback();
Console.WriteLine("happy coding,yes");
Thread.Sleep(44000);
Console.WriteLine("Continue Happy coding");
Thread.Sleep(2000);
Thread.Sleep(2000);
Console.ReadKey();
}
static void mycall(IAsyncResult result)
{
Console.WriteLine("where am i?");
Console.WriteLine("当前线程ID:" + Thread.CurrentThread.ManagedThreadId);
AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;
Console.WriteLine(handler.EndInvoke(result));
Console.WriteLine(result.AsyncState);
}
}
}
代码中主函数使⽤的是异步回调,为了说明其优越性,代码提供了
其他两种⽅法来做⽐较:
1.同步调⽤,代码在sync_call函数中,
这个其实还是本线程调⽤,和调⽤个函数没区别。
2.异步调⽤
在async_call函数中,调⽤完handler.BeginInvoke 之后,主线程会继续往下执⾏,
但是在handler.EndInvoke的时候,如果任务没有完成,还是会阻塞在这⾥。
注意使⽤异步回调的核⼼代码:
IAsyncResult result = handler.BeginInvoke(1, 2, new AsyncCallback(mycall), "AsyncState:OK");第三个参数注册回调函数,第三个传递⼀个object对象。
回调函数mycall在任务线程⾥⾯执⾏,
AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;来获取委托对象,然后再handler.EndInvoke(result) 返回值。
在回调函数中获取主线程的委托对象还可以使⽤如下⽅法:
在BeginInvoke的时候将 ,委托对象传到第四个参数,
回调函数中使⽤result.AsynState 再转成(AddHandler)
AddHandler handler = (AddHandler)(result.AsyncState);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论