首页 > 编程语言 > 详细

c# 多线程使用总结

时间:2021-01-28 08:58:41      阅读:49      评论:0      收藏:0      [点我收藏+]

 

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")}***************");
}

c# 多线程使用总结

原文:https://www.cnblogs.com/csj007523/p/14337630.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!