随笔分类 -  C#异步编程

摘要:默认情况下,当您使用async/await时,它将在开始请求的原始线程上继续运行(状态机)。 但是,如果当前另一个长时间运行的进程已经接管了该线程,那么你就不得不等待它完成。要避免这个问题,可以使用ConfigureAwait的方法和false参数。当你用这个方法的时候,这将告诉Task它可以在任何 阅读全文
posted @ 2022-11-07 19:07 卖雨伞的小男孩 阅读(318) 评论(0) 推荐(1) 编辑
摘要:一、ManualResetEvent的使用 ManualReset是一种同步原语,它可以用于控制多个线程的执行顺序。ManualReset通常用于线程之间的通信,例如一个线程需要等待另一个线程完成某个操作后才能继续执行。 ManualReset的工作原理很简单,它维护一个状态变量,当状态为true时 阅读全文
posted @ 2021-10-16 15:20 卖雨伞的小男孩 阅读(245) 评论(0) 推荐(0) 编辑
摘要:AutoResetEvent在.Net多线程编程中,经常用到。当某个线程调用WaitOne方法后,信号处于发送状态,该线程会得到信号, 程序就会继续向下执行,否则就等待。而且 AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会 阅读全文
posted @ 2021-10-16 15:12 卖雨伞的小男孩 阅读(253) 评论(0) 推荐(0) 编辑
摘要:等待所有子线程执行完毕 class StopAllWaitBySubThread { List manualEvents = new List(); public void Main() { ManualResetEvent mre = new ManualResetEvent(false); ma 阅读全文
posted @ 2021-10-16 14:40 卖雨伞的小男孩 阅读(68) 评论(0) 推荐(0) 编辑
摘要:ManualResetEvent的基本用法: 1、初始化:public ManualResetEvent(bool initialState); ManualResetEvent的构造方法有个bool型参数,当为true时,则表示有信号,为false时,则表示无信号。这个怎么理解呢?我们接着看Man 阅读全文
posted @ 2021-10-16 14:37 卖雨伞的小男孩 阅读(183) 评论(0) 推荐(0) 编辑
摘要:有这么个场景,A线程执行A函数,B线程执行B函数,C线程执行C函数,并且ABC函数要按顺序执行,如何实现 我们可以利用Monitor和ConcurrentDictionary来实现。 Monitor是比lock更灵活操作,再.net中,lock在中间语言会被翻译成Monitor; Concurren 阅读全文
posted @ 2020-08-21 11:22 卖雨伞的小男孩 阅读(566) 评论(0) 推荐(1) 编辑
摘要:一、进程内部的线程同步 1、使用lock,用法如下: private static readonly object SeqLock = new object(); private void Print() { lock (SeqLock) { Console.WriteLine("test"); } 阅读全文
posted @ 2020-07-27 17:05 卖雨伞的小男孩 阅读(318) 评论(0) 推荐(0) 编辑
摘要:一、单个参数(封箱也可实现多参数) class B { public static void Main() { Thread t = new Thread(new ParameterizedThreadStart(Test)); t.Start("a"); Console.Read(); } pri 阅读全文
posted @ 2019-11-25 17:13 卖雨伞的小男孩 阅读(1593) 评论(0) 推荐(0) 编辑
摘要:一、SynchronizationContext顾名思义是同步上下文的意思。利用此对象可以实现线程间数据的同步、异步访问。 二、例子 class Program { static Thread _workThread; static SynchronizationContext _mainThrea 阅读全文
posted @ 2019-11-25 16:43 卖雨伞的小男孩 阅读(2265) 评论(0) 推荐(0) 编辑
摘要:微软示例: 上面是微软给的写法,给按钮的响应方法加上async,然后await ExampleMethodAsync 但是其实async和await表达式写法: Task.Run 和 Lambda表达式,用起来其实更加简单。 在 => { }范围内写任何代码都是异步执行的,因此不用担心某几个语句是否 阅读全文
posted @ 2019-11-07 15:05 卖雨伞的小男孩 阅读(848) 评论(0) 推荐(0) 编辑
摘要:一、问题由来 多线程能实现的基础: 1、CPU运行速度太快,硬件处理速度跟不上,所以操作系统进行分时间片管理。这样,宏观角度来说是多线程并发 ,看起来是同一时刻执行了不同的操作。但是从微观角度来讲,同一时刻只能有一个线程在处理。 2、目前电脑都是多核多CPU的,一个CPU在同一时刻只能运行一个线程, 阅读全文
posted @ 2019-04-29 18:10 卖雨伞的小男孩 阅读(264) 评论(0) 推荐(0) 编辑
摘要:一、Task关键字解释 Task 类的表示的单个操作不会返回一个值,通常以异步方式执行。 Task 对象是一种的中心思想 基于任务的异步编程模式 首次引入.NET Framework 4 中。 因为由执行工作 Task 对象通常上异步执行一个线程池线程而不是以同步方式在主应用程序线程中,您可以使用 阅读全文
posted @ 2018-11-09 17:09 卖雨伞的小男孩 阅读(645) 评论(0) 推荐(0) 编辑
摘要:4.0用 Task.Factory.StartNew(()=>{}); 4.0以下用 ThreadPool.QueueUserWorkItem(()=>{}) 4.0以上用 Task.Run(()=>{}); 多任务: Task[] tasks = new Task[maxCurrent]; for 阅读全文
posted @ 2017-09-13 19:32 卖雨伞的小男孩 阅读(572) 评论(0) 推荐(0) 编辑
摘要:文中所有Task<TResult>的返回值都是直接用task.result获取,这样如果后台任务没有执行完毕的话,主线程会等待其执行完毕,这样的话就和同步一样了(看上去一样,但其实await的时候并不会造成线程的阻塞,web程序感觉不到,但是wpf,winform这样的桌面程序若不使用异步,会造成U 阅读全文
posted @ 2017-08-25 22:13 卖雨伞的小男孩 阅读(8724) 评论(0) 推荐(0) 编辑
摘要:Parallel是循环中开启多线程 循环List<T> 阅读全文
posted @ 2017-08-25 22:07 卖雨伞的小男孩 阅读(662) 评论(0) 推荐(0) 编辑
摘要:Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程。 我们可以说Task是一种基于任务的编程模型。它与thread的主要区别是,它更加方便对线程进程调度和获取线程的执行结果。 Task类和 阅读全文
posted @ 2017-08-25 21:26 卖雨伞的小男孩 阅读(8482) 评论(0) 推荐(0) 编辑
摘要:Semaphore负责协调线程,可以限制对某一资源访问的线程数量 这里对SemaphoreSlim类的用法做一个简单的例子: 可以看到,刚开始只有三个线程在执行,当一个线程执行完毕并释放之后,才会有新的线程来执行方法! 阅读全文
posted @ 2017-08-25 20:58 卖雨伞的小男孩 阅读(402) 评论(0) 推荐(0) 编辑
摘要:术语解释: APM 异步编程模型, Asynchronous Programming Model EAP 基于事件的异步编程模式, Event-based Asynchronous Pattern TAP 基于任务的异步编程模式, Task-based Asynchronous Pattern 一、 阅读全文
posted @ 2017-06-30 15:32 卖雨伞的小男孩 阅读(2455) 评论(0) 推荐(1) 编辑
摘要:简介: 一个托管线程的创建需要数千个CPU周期,并且当发生线程切换时也会带来明显的开销。考虑线程的重用,避免不断重复创建新的线程是提高系统效率的一种方式。 线程池是一种提供效率的方式,它创建好一些线程由线程池引擎管理,开发者将需要处理的业务或操作封装成为【工作项】工作项被传递给线程池队列,由线程池中 阅读全文
posted @ 2017-06-30 11:34 卖雨伞的小男孩 阅读(692) 评论(0) 推荐(0) 编辑
摘要:await,task,async 阅读全文
posted @ 2016-10-17 12:34 卖雨伞的小男孩 阅读(491) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示