最近公司忙 有一周多时间没有更新了,下面继续
今天学的是异步多线程
首先把老师总结的知识点搬上来看一下 ,挺好理解的
1、异步方法会卡界面,异步多线程不会卡界面,因为同步方法会占用UI线程,无法响应其他操作;异步多线程,不会占用UI线程,方法由子线程完成
2、同步方法慢,只有主线程在执行方法;异步方法快,启动了多个线程同时执行方法,当然这样会占用更多的资源(多线程的调度管理,也需要消耗资源的)
3、异步多线程的方法启动和执行是无序的,因为线程的申请是无序获取的;不同线程任务执行的速度也不一定相同
下面来一套代码
首先是 不获取返回值的
//待执行的委托方法
Action<int> act = t =>
{
Thread.Sleep(1000);//为了看效果 延迟一下
Console.WriteLine("方法启动{0},当前线程ID为{1}", t.ToString(), Thread.CurrentThread.ManagedThreadId);
};
//List保存启动线程的Iasync
List<IAsyncResult> asyncList = new List<IAsyncResult>();
//回调函数
AsyncCallback asyback = t =>
{
Thread.Sleep(1000);//为了看效果 延迟一下
Console.WriteLine("这里是回调函数:参数为{0},线程ID为{1}", t.AsyncState, Thread.CurrentThread.ManagedThreadId);
};
//多线程执行5次
for (int i = 0; i < 5; i++)
{
//启动线程 并添加到List中 此步骤目的是为了可以下面进行多线程等待,如果不需要等待也不需要获取返回值,可不进行List添加
asyncList.Add(act.BeginInvoke(i, asyback, i));
}
Console.WriteLine("等待前");
//等待
foreach (IAsyncResult async in asyncList)
{
async.AsyncWaitHandle.WaitOne();
}
Console.WriteLine("等待后");
结果
再来一种等待的代码
while (asyncList.Where(t => t.IsCompleted == true).Count() <asyncList.Count())
{
Thread.Sleep(200);
}
再来一套有返回值的
//创建一个委托
Func<int, string> func = t =>
{
Thread.Sleep(2000);
Console.WriteLine("正在执行委托方法{0}线程编号{1}", t.ToString(), Thread.CurrentThread.ManagedThreadId);
return t.ToString();
};
//通过键值对保存每个线程启动方法时生成的Iasync
Dictionary<int, IAsyncResult> d = new Dictionary<int, IAsyncResult>();
AsyncCallback asybak = t =>
{
Thread.Sleep(2000);
Console.WriteLine("这里是回调函数{0}线程编号{1},本线程返回结果{2}", t.AsyncState, Thread.CurrentThread.ManagedThreadId, func.EndInvoke(d[(int)t.AsyncState]));
};
//多线程调用
for (int i = 0; i < 5; i++)
{
//调用并添加到键值对中
d.Add(i, func.BeginInvoke(i, asybak, i));
}
Console.WriteLine("等待前");
//等待
for (int i = 0; i < d.Count; i++)
{
d[i].AsyncWaitHandle.WaitOne();
}
Console.WriteLine("都执行完了");
结果