博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步编程学习
阅读量:4477 次
发布时间:2019-06-08

本文共 2917 字,大约阅读时间需要 9 分钟。

 

摘抄自文章:

异步编程中重要的技术点在于:

1)当异步线程在工作完成时,如何通知调用线程?

2)当异步线程出现异常的时,该如何处理?

3)异步线程工作的进度,如何实时的通知调用线程?

4)如何在调用线程中,取消正在工作的异步线程,并进行回滚操作?

 

完整的异步调用例子:

class Program    {        public delegate int DoWord(int count);        static void Main(string[] args)        {            DoWord d = new DoWord(WorkPro);            IAsyncResult r= d.BeginInvoke(100,CallBack ,d);//no.1            for (int i = 0; i < 100; i++)            {                Thread.Sleep(10);//主线程需要做的事            }            Console.WriteLine("主线程done");            Console.ReadKey();        }        public static int WorkPro(int count)        {            int sum = 0;            //做一些耗时的工作            for (int i = 0; i < count; i++)            {                sum += i;                Thread.Sleep(10);            }            return sum;                }         public static void CallBack(IAsyncResult r)        {            DoWord d = (DoWord)r.AsyncState;            Console.WriteLine("异步调用完成,返回结果为{0}", d.EndInvoke(r));        }    }

以上被博主称之为异步函数模型。

 

Thread类

class Program    {        static void Main(string[] args)        {            Thread t = new Thread(WorkPro);//no.1            t.IsBackground = true;//no.2            t.Start(1000);//no.3        }        public static void WorkPro(object  t)        {            //做一些耗时的工作               int count=(int)t;            for (int i = 0; i < count; i++)            {                Thread.Sleep(2000);            }             Console.WriteLine("任务处理完成");        }    }
Thread类的使用虽然简单,但是它还是有一定的劣势的,一般不推荐使用。
1)Thread类创建的是一个专用线程,建立一个专用线程是非常耗用系统的资源,建议是使用线程池中的线程。
2)Thread类不能很好的和调用线程进行交互,当任务完成时不能及时的通知,在调用线程也不能随时的取消正在进行的任务。
另外在以下情况下,就只能选择使用
Thread类了。
1)执行任务的线程要以非普通的优先级去执行,因为线程池的线程都是以普通优先级运行的。
2)执行任务的线程要表现为一个前台线程,因为线程池的线程始终都是一个后台线程。
3)异步执行的任务需要长时间的,那么就可以使用Thread类为该任务建立一个专用线程。

 

Task类

public partial class Form1 : Form    {        private readonly TaskScheduler contextTaskScheduler;//声明一个任务调度器        public Form1()        {            InitializeComponent();            contextTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();//no.1获得一个上下文任务调度器        }         private void button1_Click(object sender, EventArgs e)        {            Task
t = new Task
((n) => Sum((int)n),100); t.Start(); t.ContinueWith(task =>this.textBox1 .Text =task.Result.ToString(),contextTaskScheduler);//当任务执行完之后执行 t.ContinueWith(task=>MessageBox .Show ("任务出现异常"),CancellationToken.None ,TaskContinuationOptions.OnlyOnFaulted,contextTaskScheduler );//当任务出现异常时才执行 } int Sum(int count) { int sum = 0; for (int i = 0; i < count; i++) { Thread.Sleep(10); sum += i; } Console.WriteLine("任务处理完成"); return sum; } }

这是一个比较完整的Task应用例子。详情可以阅读摘抄的博客原文。

 

博客:

有个完整的使用多线程的例子。代码比较复杂。

 

 

 

 

 
 

 

转载于:https://www.cnblogs.com/Tpf386/p/9951115.html

你可能感兴趣的文章
【MySQL笔记】字符串、时间日期转换
查看>>
jQuery实战之仿淘宝商城左侧导航效果
查看>>
AC日记——「SCOI2016」幸运数字 LiBreOJ 2013
查看>>
unmount
查看>>
数据库连接池
查看>>
javascript获得和设置以及移除元素属性的三个方法
查看>>
windwos iis 7.5 使用html 报405错误
查看>>
范围(地址转换)
查看>>
Unity3D游戏,TCP,WEBCOSKT,HTTP通信架构 weaving-socket
查看>>
【小程序入门集锦】19,微信小程序个人帐号申请
查看>>
php写一个简单的计算器
查看>>
【JAVA零基础入门系列】Day3 Java基本数据类型
查看>>
两个整数,求他们的最小公倍数和最大公约数
查看>>
Mongo索引
查看>>
php 实现设计模式之 建造者模式
查看>>
An Easy C Program Problem
查看>>
Replace Nested Conditional with Guard Clauses(用卫语句代替嵌套循环)
查看>>
jsp中${}是EL表达式的常规表示方式
查看>>
GoldenGate常见问题及处理
查看>>
Android JNI学习(五)——Demo演示
查看>>