进程线程这部分理解的不好,先记一笔吧
1.一般的同步委托
运行程序时,从头到尾都只有一个线程,想:可不可以在利用一个子线程去帮我执行我的委托方法,不影响我的主线?
答案当然是可以,我们可以新建Thread类的线程,或者利用异步委托(线程池的工作者线程),不适合用新建的线程,因为它不便于管理。
所以有了异步委托,原理就是:使用了一个线程池的线程去执行了委托指向的方法。
2.异步委托的存在理由:
1)不影响主线程的执行
2)合理的利用ThreadPool线程池的线程
3)异步委托本质是调用了线程池的工作者线程,不需要为了新建和注销线程烦恼,统一由线程池管理。
3.并不是说异步委托比同步快,有时候同步比异步快,有时候异步比同步块,由具体情况决定。
上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _4.异步委托
{
class Program
{
static void Main(string[] args)
{
//打印当前主线程
Console.WriteLine(" 主线程:" + Thread.CurrentThread.ManagedThreadId);
//定义一个委托实例
Func<int, int, string> delFunc = (a, b) =>
{
///打印当前线程
Console.WriteLine(" 当前异步委托进程:" + Thread.CurrentThread.ManagedThreadId);
return (a + b).ToString();
};
//同步调用,主线程执行
// string str = delFunc(3, 4);
// Console.WriteLine(str);
//异步调用委托:
delFunc.BeginInvoke(3,4,null,null);
Console.ReadKey();
#region 异步委托 简单方式
//拿到异步委托的结果
IAsyncResult result = delFunc.BeginInvoke(3, 4, null, null);
if (result.IsCompleted)
{
}
// endoinvoke方法会阻塞当前的线程,直到异步委托指向完成之后,才能继续往下执行。
string str = delFunc.EndInvoke(result);
Console.WriteLine(str);
#endregion
#region 有回调函数的异步委托
//delFunc.BeginInvoke(5, 6, MyAsyncCallback, "123");
delFunc.BeginInvoke(5, 6, MyAsyncCallback, delFunc);
#endregion
Console.ReadKey();
}
//回调函数:是异步委托方法执行完成之后,再来调 回调函数。
public static void MyAsyncCallback(IAsyncResult ar)
{
var del = (Func<int, int, string>)ar.AsyncState;
string str = del.EndInvoke(ar);
////1、拿到异步委托执行的结果
//AsyncResult result = (AsyncResult)ar;
//var del = (Func<int, int, string>)result.AsyncDelegate;
//string returnValue = del.EndInvoke(result);
//Console.WriteLine("返回值是:"+returnValue);
////2、拿到给回调函数的参数。
//Console.WriteLine("传给异步回调函数的参数:"+result.AsyncState);
Console.WriteLine("回调函数的线程 的id是:" + Thread.CurrentThread.ManagedThreadId);
}
}
}
说点什么
欢迎讨论