net .异步委托知识

 以前在编程中,异步用的比较少,导致C# 一些基础的 东西用法都不怎么熟悉,经常要用的时候在去查找资料比较被动,而已没真正里面理解起来,始终感觉不是自己的知识 (题外话)

  首先委托关键字  Delegate 

 1) 定义  

/// 委托必须和要调用的异步方法有相同的签名
public delegate string AsyncMethodCaller(int callDuration, out int threadId);

2. 异步委托的方法 

static string TestMethod(int callDuration, out int threadId)
{
Thread.Sleep(callDuration);
threadId = Thread.CurrentThread.ManagedThreadId;
return string.Format("My call time was {0}.", callDuration.ToString());
}

3) 调用 

 AsyncMethodCaller caller = new AsyncMethodCaller(TestMethod);

IAsyncResult result = caller.BeginInvoke(10000, out threadId, null, null);
//调用EndInvoke方法,等待异步调用完成,并得到结果。
string returnValue = caller.EndInvoke(out threadId, result);

注意里面几个关键字  BeginInvoke , EndInvoke  IAsyncResult   

  BeginInvoke方法触发你的异步方法,它和你想要执行的异步方法有相同的参数。另外还有两个可选参数,第一个是AsyncCallback委托是异步完成的回调方法。第二个是用户自定义对象,该对象将传递到回调方法中。BeginInvoke立即返回并且不等待完成异步的调用(继续执行该下面的代码,不需要等待)。BeginInvoke返回IAsyncResult接口,可用于检测异步调用的过程。

通过EndInvoke方法检测异步调用的结果。如果异步调用尚未完成,EndInvoke将阻塞调用线程,直到它完成。EndInvoke参数包括out和ref参数。

  当然也可以不用 EndInvoke 来异步检测 可以使用  

第二种 

result .AsyncWaitHandle.WaitOne(); 阻塞当前主线程 知道异步的方法完成回调触法 
result .AsyncWaitHandle.Close();  用完关闭 

第三种方法  

  先定义

1)  AutoResetEvent autoresetevent = new AutoResetEvent(false);

2) 在异步方法里完成时候设置信号 等待回调 autoresetevent.Set();

3)  在主线程 调用异步的方法后 设置等待   autoresetevent.WaitOne();

  还有一种 委托用法 很方便 个人建议使用 后面这种用法 Action 有参数没有方法值   Func 有返回值没参数 

  定义 :

Action<string, string> act = new Action<string, string>(ShowString);

异步方法:

void ShowString(string str, string yy)
{
Thread.Sleep(50000);
}

定义
 Func<bool> methodCall = SendToFile;

异步方法 

public bool SendToFile()
{
return true;
}

使用后面这种委托的 配合使用NET3.0以后的新特性 Lambda表达式表达式 代码看起来  很简便 不用过多的定义  

例如 

AutoResetEvent autoresetevent = new AutoResetEvent(false);
Action<string, string> act = new Action<string, string>((o, p) =>
{
Thread.Sleep(5000);
autoresetevent.Set();

});
act.BeginInvoke("11", "222", null, null);
autoresetevent.WaitOne();
autoresetevent.Close();

 ()=> 表示一个匿名函数,=>前面的是参数,后面的是函数体。 可以把它当作一个函数

 

 

 

 

 

 

   

  

  

 

posted @ 2017-11-09 16:04  北泽羽〃南宫月  阅读(223)  评论(0编辑  收藏  举报