111,129
社区成员
发帖
与我相关
我的任务
分享
public static void Test()
{
AsyncRunner<int> runTest = new AsyncRunner<int>();
runTest.AsyncRun(
//调用的方法
(AsyncRunner<int>.CallHandler)delegate(object[] p)
{
//以下是你的想异步执行的代码,你也可以直接调用一个另外的方法
int start = (int)p[0];
int len = (int)p[1];
int result = 1;
for (int i = start; i < len; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
result *= i;
}
return result;
},
//这里是参数列表,对应在上一个委托参数中使用
new object[] { 1, 10 },
//这里是回调函数,result是结果,类型是泛化类型。这个方法会在异步执行完调用方法后调用
(AsyncRunner<int>.CallBackHandler)delegate(int result)
{
Console.WriteLine("result is " + result.ToString());
});
}
/// <summary>
/// 异步执行类
/// </summary>
/// <typeparam name="T"></typeparam>
public class AsyncRunner<T>
{
/// <summary>
/// 异步执行的结果
/// </summary>
public T result { get; set; }
/// <summary>
/// 方法委托
/// </summary>
/// <param name="p">参数</param>
/// <returns>返回值</returns>
public delegate T CallHandler(object[] p);
/// <summary>
/// 异步调用后的处理
/// </summary>
/// <param name="result">使用之前的结果</param>
public delegate void CallBackHandler(T result);
/// <summary>
/// 异步调用
/// </summary>
/// <param name="runner">AsyncRunner<T>.CallHandler对象</param>
/// <param name="p">参数</param>
/// <param name="back">回调的方法</param>
public void AsyncRun(CallHandler runner, object[] p, CallBackHandler back)
{
new Thread((ThreadStart)delegate
{
result = runner(p);
if (back != null) back(result);
}).Start();
}
}