c# 多线程使用总结
线程:Thread类是C#语言对线程对象的一个封装;
4核8进程:模拟核,一个CPU每秒10亿次计算,可以分成多个片,每个片可被一个线程使用
CPU分片:操作系统把:CPU分片,一个物理CPU同时只能为一个任务服务;
同步方法:发起调用,执行完后依次执行下一个任务
异步方法:任何一个异步多线程离不开委托,发起调用,启动一个新的线程来完成任务;
Action<string> action= this.DoSomething;
action.BeginInvoke("btn");
1.同步方法卡界面,主线程忙与计算,无暇他姑;异步方法不卡,主线程闲置,计算任务交给子任务;
可以改善用户体验,web应用发短信通知,启动异步多线程去完成;
卡界面,慢,启动有序/不卡,快,启动无序;
资源换性能 :
1.资源不是无限的;
2.资源调度损耗;
3.所有线程并不是越多越好;
程序向线程池发线程请求,线程池向操作系统请求资源,安排不同的CUP片调度处理
多线程由时间先后顺序要求的,要特别小心,不能通过延时,预估来估计;
并行:多核之间叫并行
并发:CPU分片的并发;同一时间做多个事
CPU * 4
async
2.判断多线程执行完成的方法;
1.回调callback;
2.asyncResult.IsComleted
3.WaitOne:asyncResult.AsyncWaitHandle.WaitOne()
4.EndInvoke(asyncResult)
private void TestThread( )
{
//Action<string> action = this.DoSomethingLong;
////1 回调:将后续动作通过回调参数传递进去,子线程完成计算后,去调用这个回调委托
IAsyncResult asyncResult = null;//是对异步调用操作的描述
AsyncCallback callback = ar =>
{
Console.WriteLine($"{object.ReferenceEquals(ar, asyncResult)}");
Console.WriteLine($"btnAsyncAdvanced_Click计算成功了。{ar.AsyncState}。{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
};
asyncResult = action.BeginInvoke("btnAsyncAdvanced_Click", callback, "aa");
//2 通过IsComplate等待,卡界面--主线程在等待,边等待边提示
//( Thread.Sleep(200);位置变了,少了一句99.9999)
int i = 0;
while (!asyncResult.IsCompleted)
{
if (i < 9)
{
Console.WriteLine($"中华民族复兴完成{++i * 10}%....");
}
else
{
Console.WriteLine($"中华民族复兴完成99.999999%....");
}
Thread.Sleep(200);
}
Console.WriteLine("中华民族复兴已完成,沉睡的东方雄狮已觉醒!");
// 3 WaitOne等待,即时等待 限时等待
asyncResult.AsyncWaitHandle.WaitOne();//直接等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(-1);//一直等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(1000);//最多等待1000ms,超时就不等了
//4 EndInvoke 即时等待, 而且可以获取委托的返回值 一个异步操作只能End一次
action.EndInvoke(asyncResult);//等待某次异步调用操作结束
Console.WriteLine("全部计算成功了。。");
Func<int> func = () =>
{
Thread.Sleep(2000);
return DateTime.Now.Hour;
};
int iResult = func.Invoke();//22
IAsyncResult asyncResult = func.BeginInvoke(ar =>
{
//int iEndResultIn = func.EndInvoke(ar);
}, null);
int iEndResult = func.EndInvoke(asyncResult);//22
Console.WriteLine($"****************btnAsync_Click End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
}
原文:https://www.cnblogs.com/csj007523/p/14337630.html