当前位置: 首页 > wzjs >正文

云南省建设教育协会网站网站开发加维护大概多少钱

云南省建设教育协会网站,网站开发加维护大概多少钱,导航网站的好处,广告设计学哪些软件目前C#多线程大部分大部分都是清一色的Task,这里就先主要讲一下Task 本文主要讲解线程的启动,延迟执行,线程等待,线程的异常捕获及线程的取消 1.线程的启动: 主要有三种方式 方式一 Task task new Task(() >{System.Diagnostics.Debug.WriteLine($"Task开启了一个线程…

目前C#多线程大部分大部分都是清一色的Task,这里就先主要讲一下Task
本文主要讲解线程的启动,延迟执行,线程等待,线程的异常捕获及线程的取消

1.线程的启动:
主要有三种方式
方式一

        Task task = new Task(() =>{System.Diagnostics.Debug.WriteLine($"Task开启了一个线程, TheadId:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");});**task.Start();**

方式二

       Task.Run(()=>         {System.Diagnostics.Debug.WriteLine($"Run开启了一个线程, TheadId:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");});

方式三

TaskFactory factory = new TaskFactory();
factory.StartNew(()=>
{System.Diagnostics.Debug.WriteLine($"Factory开启了一个线程, TheadId:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});

2. Task延迟执行方法Delay.如下方法

private void TestTask()
{Debug.WriteLine("主线程开始");Console.WriteLine("Task.Delay Start");Stopwatch timer = new();timer.Start();Task.Delay(100).ContinueWith((s, x) => {Debug.WriteLine($"ContinueWith中启动一个线程, TheadId:{Thread.CurrentThread.ManagedThreadId:00}");}, null);timer.Stop();Debug.WriteLine($"Task.Delay耗时:{timer.ElapsedMilliseconds}");Console.WriteLine("Task.Delay End");Debug.WriteLine("主线程结束");}

执行后的代码
主线程开始
Task.Delay耗时:0
主线程结束
ContinueWith中启动一个线程, TheadId:41

由此可见Delay延迟不会阻塞主线程,主线程执行到这里会继续执行.在delay等待一定的时间后再执行ContinueWith中的委托

3.等待一个任务完成就执行另一个动作和等待所有任务完成执行另一个动作

    private void TestTask(){List<Task> taskList = new List<Task>();Task task1 = Task.Run(() => DoWork("设计", 10000));Task task2 = Task.Run(() => DoWork("框架", 5000));Task task3 = Task.Run(() => DoWork("分析", 3000));Task task4 = Task.Run(() => DoWork("对接", 1000));taskList.Add(task1);taskList.Add(task2);taskList.Add(task3);taskList.Add(task4);**int index = Task.WaitAny(taskList.ToArray());**Debug.WriteLine($"Task {index + 1} completed first.");//Task.WaitAll(taskList.ToArray());//Debug.WriteLine("all Task completed first.");}private async Task DoWork(string taskName, int delay){Debug.WriteLine($"{taskName} is Start.");await Task.Delay(delay); // 模拟工作Debug.WriteLine($"{taskName} is completed.");}

4.异常的捕获
先看一下下面的代码

    private void ProcessException(){try{for (int i = 0; i < 20; i++){string k = $"{i}";Task.Run(() =>{if (k.Equals("8")){throw new Exception("因为k == 8,这里就异常了");}else if (k.Equals("11")){throw new Exception("因为k == 11,这里就异常了");}else if (k.Equals("15")){throw new Exception("因为k == 15,这里就异常了");}});}}catch(Exception err){Debug.WriteLine(err.Message);}}

上述代码异常时catch中并没有输出任何东西,这说明多线程内部发生异常时try catch是不能捕获的.
需要对代码进行调整:
1.增加对多任务的等待 wait
2.在catch中增加AggregateException的捕获
代码如下

    private void ProcessException(){try{List<Task> list = new();for (int i = 0; i < 20; i++){string k = $"{i}";Task task = Task.Run(() =>{if (k.Equals("8")){throw new Exception("因为k == 8,这里就异常了");}else if (k.Equals("11")){throw new Exception("因为k == 11,这里就异常了");}else if (k.Equals("15")){throw new Exception("因为k == 15,这里就异常了");}});list.Add(task);}Task.WaitAll(list.ToArray());}catch(AggregateException err){foreach (var inner in err.Flatten().InnerExceptions){Debug.WriteLine(inner.Message);}}}

这样改动后,异常最终都会在catch中输出了

5.线程的取消 应用CancellationTokenSource
一个任务长时间运行或多个任务启动执行,如何中间取消了操作,则后续的动作或线程不再继续执行
代码如下
一个任务长时间运行代码如下

private async void CancelThread()
{CancellationTokenSource cts = new CancellationTokenSource();// 获取 CancellationTokenCancellationToken token = cts.Token;// 启动一个长时间运行的任务,并传递 CancellationTokenTask longRunningTask = LongRunningOperationAsync(token);// 模拟一些主线程上的其他操作await Task.Delay(2000); // 等待2秒// 请求取消操作cts.Cancel();try{// 等待长时间运行的任务完成await longRunningTask;}catch (OperationCanceledException ex){Debug.WriteLine($"Operation was canceled: {ex.Message}");}
}private async Task LongRunningOperationAsync(CancellationToken token)
{for (int i = 0; i < 10; i++)//5s{token.ThrowIfCancellationRequested();Debug.WriteLine($"Working... {i + 1}");await Task.Delay(500, token); // 模拟异步工作,并传递 CancellationToken 以支持取消}Debug.WriteLine("Operation completed.");
}

多个任务中间任务取消代码如下

    private async void CancelThread(){CancellationTokenSource cts = new CancellationTokenSource();List<Task> tasks = [];for (int i = 0; i < 10; i++){if (cts.Token.IsCancellationRequested)// 检查是否已经请求了取消{Debug.WriteLine($"Cancellation requested at task {i}.");break;}int taskId = i;tasks.Add(Task.Run(async () => await ExecuteTaskAsync(taskId, cts.Token), cts.Token));if (i == 2) {cts.Cancel();Debug.WriteLine($"{i} Cancellation requested.");}}try{await Task.WhenAll(tasks);}catch (OperationCanceledException){Debug.WriteLine("One or more tasks were canceled.");}Debug.WriteLine("All done.");}private async Task ExecuteTaskAsync(int taskId, CancellationToken token){for (int i = 0; i < 3; i++) // 模拟任务的工作{token.ThrowIfCancellationRequested();Debug.WriteLine($"Task {taskId} is working... {i + 1}");await Task.Delay(500, token); // 模拟异步工作}Debug.WriteLine($"Task {taskId} completed.");}

6.几种现象

private void TestThread()
{for (int i = 0; i < 20; i++){Task.Run(() =>{Thread.Sleep(1000);Debug.WriteLine($"{i} 开始执行了");});}
}

这个方法的输出一直是"20 开始执行了";
修改一下后代码如下

    private void TestThread(){for (int i = 0; i < 20; i++){int k = i;Task.Run(() =>{Thread.Sleep(1000);Debug.WriteLine($"{k} 开始执行了");});}}

这时,k就是序号了.


文章转载自:

http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://00000000.tgtrk.cn
http://www.dtcms.com/wzjs/616400.html

相关文章:

  • 免费笑话网站系统php手机网站后台源码
  • 网站解析需要多久生效建设企业网站官网登录
  • 网站建设综合训练浙江建设厅 继续教育 网站
  • 嘉兴网站推广企业wordpress 登录界面插件
  • 网站建设与文字的工作太原建站公司有哪些
  • 企业网站升级企业注册资金变更流程
  • 开题报告电子商务网站建设怎么在百度上制作自己的网站
  • 扬州有做义工的地方或网站嘛无锡企业免费建站
  • 做网站申请域名大概花费多少网站关键词优化怎么做的
  • 科技网站建设 长沙英文网站建设公司
  • 谷歌外贸网站seo怎么做h5网站实例
  • 建站行业的乱象丹东网站网站建设
  • 宁波那家公司做网站好湖南省做网站那个企业便宜
  • 网站免费推广计划电商网站如何备案
  • 深圳建网站技术上海外包seo
  • 中小企业网站建设教程网站内容建设方案
  • 制作网站平台做食品网站用什么颜色
  • 网站开发哪里可做私活奖券世界推广网站
  • kocool网站开发网站建设部门管理制度
  • 苏州网站托管qq邮箱登录入口网页版
  • 济南做网络安全的公司广州seo公司品牌
  • 卡二卡三卡四精品系统优化最好的安卓手机
  • 开网站做女装好还是童装好做商城网站需要备案吗
  • 公司名称变更网站要重新备案网站怎么做显得简洁美观
  • 重庆知名网站高级感ppt模板
  • seo网站优化网站编辑招聘什么软件可以推广自己的产品
  • 好文案网站都市人才网莱芜
  • 设计一个全面了解湖南的网站企业做网络推广有什么好处
  • 凌河锦州网站建设网站的ftp账号和密码是什么
  • 网站后台是怎么更新wordpress 有缓存吗