BLToolkit-Aspect-AsyncAspect (一)

 

目录

 

异步调用 

 

这一 aspect 简化了异步操作.注意AsyncAspect 不与其他属性兼容 ,如果你应用他们到 AsyncAspect 的一个抽象方面上.它将会无效.

 

代码示例.

1. 引用命名空间

 

using System.Threading;
using BLToolkit.Aspects;
using BLToolkit.Reflection;

 

2. 新建抽象类AsyncTestObject

 1 public abstract class AsyncTestObject
 2     {
 3         /// <summary>
 4         /// 我们将会异步调用这个方法
 5         /// </summary>
 6         /// <param name="intVal"></param>
 7         /// <param name="strVAl"></param>
 8         /// <returns></returns>
 9         public int Test(int intVal, string strVAl)
10         {
11             Thread.Sleep(200);
12             return intVal;
13         }
14 
15 
16         // 开始异步方法应该和需要调用的方法具有相同的参数.并返回IAsyncResult
17         // 可以提供两个额外的参数 AsyncCallback  and state object
18         // ‘Begin’前缀是约定的一部分
19         [Async]
20         public abstract IAsyncResult BeginTest(int intVal,string strVal);
21 
22         [Async]
23         public abstract IAsyncResult BeginTest(int intVal, string strVal, AsyncCallback callback);
24 
25         [Async]
26         public abstract IAsyncResult BeginTest(int intVal, string strVal, AsyncCallback callback, object state);
27 
28         //结束异步方法应该使用 IAsyncResult作为传入参数 并且返回值应该和需要调用的方法一致
29         //‘End’前缀是约定的一部分
30         [Async]
31         public abstract int EndTest(IAsyncResult asyncResult);
32 
33         //Begin/End前缀并不是必须的. 你可以使用任何名字
34         //如果你提供一个目标方法的名字作为一个参数传入Async属性。
35         [Async("Test")]
36         public abstract IAsyncResult AnyName(int intVal, string strVal, AsyncCallback callback, object state);
37 
38         // 在这里我们提供参数列表和方法名称
39         [Async("Test",typeof(int),typeof(string))]
40         public abstract int AnyName(IAsyncResult asyncResult);
41     }

 

3. 测试

static void Main(string[] args)
        {
            //测试一
            //AsyncTestObject o = TypeAccessor<AsyncTestObject>.CreateInstance();

            //IAsyncResult ar = o.BeginTest(1, "10");
            //Console.WriteLine(o.EndTest(ar));


            //测试二
            //AsyncTestObject o = TypeAccessor<AsyncTestObject>.CreateInstance();

            //IAsyncResult ar = o.BeginTest(2, null,CallBack,o);

            AsyncTestObject o = TypeAccessor<AsyncTestObject>.CreateInstance();
            var asyncResult = o.AnyName(1, null, null, null);
            Console.WriteLine(o.AnyName(asyncResult));

            Console.ReadKey();
        }

        /// <summary>
        /// 回调函数
        /// </summary>
        /// <param name="ar"></param>
        private static void CallBack(IAsyncResult ar)
        {
            Console.WriteLine("Callback");

            AsyncTestObject o = (AsyncTestObject)ar.AsyncState;

            o.EndTest(ar);
        }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。