利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)

利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复

    打印过程可能很长,这时候有可能需要暂停下来做一些事情,然后回来继续接着打印

    打印过程中有2个线程:一个是程序运行的主线程,一个是异步调用的打印线程,需要实现的是在主线程中的控件(暂停打印按纽)来控制打印线程

                的暂停和恢复。

    ManualResetEvent就像一个信号灯,当有信号的时候(初始化为true或者有线程调用它的set()方法)就表示所有在等待(WaitOne())的线程,你们可以

    继续运行了,当没有信号的时候(初始化为false或者有线程调用它的Reset()方法)就表示所有在等待的线程,你们继续等着      

    下面是例子代码:

//程序开始的时候设置为有信号,这样当点击打印按纽的时候,就可以直接打印static ManualResetEvent mre = new ManualResetEvent(true);private void btnPrint_Click(object sender, EventArgs e){    //在打印按纽事件中异步调用打印方法,循环打印     //在打印循环体中有一个mre.WaitOne();当信号灯有信号的时候就继续     //当信号灯没有信号的时候就暂停}

//在控制暂停和继续的按纽事件中通过设置信号灯有和无来控制继续打印还是暂停打印private void btnStopPrint_Click(object sender, EventArgs e){    if (btnStopPrint.Text == "暫停打印") {        mre.Reset();        btnStopPrint.Text = "繼續打印";    }    else if (btnStopPrint.Text == "繼續打印") {        mre.Set();        btnStopPrint.Text = "暫停打印";    }}

    还有一个AotoResetEvent和ManualResetEvent类似,只是一个是自动,一个是手动。AotoResetEvent只允许一个线程获得信号,

    当一个线程获得该信号之后AotoResetEvent就会自动Reset()掉置为无信号

时间: 2024-08-25 20:58:32

利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)的相关文章

利用回调实现Java的异步调用

异步是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用. 回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际上是调用到了自己的方法. 利用回调可以实现Java的异步调用,下面的例子来自网上. 回调接口: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... object

C#同步和异步调用

这篇文章仅当总结之用,参考了很多前辈们的文章,加上了点点自己的理解 C#的同步和异步线程是依靠委托来完成,主要需要用到委托的Invoke方法,BeginInvoke和EndInvoke方法 所谓同步线就是阻塞当前线程来完成调用的方法,然后才继续调用当前线程的后面的操作,实际上都是在同一个线程中执行,效率不高.需要用到Invoke方法 异步线程不阻塞当前线程,而是把需要调用的方法加入线程池中,来同步执行,即同一时间两个及其以上的线程共同都在执行,效率很高.需要用到BeginInvoke和EndIn

一位牛人的多线程和异步调用文章

转自小顾问原文 一位牛人的多线程和异步调用文章 首先申明:这篇文章不是我写的,我看到的一位牛人的,自己慢慢的消化了…… 摘要:本章讨论与智能客户端应用程序中多线程的使用有关的问题.为了最大限度地提高智能客户端应用程序的响应能力,需要仔细考虑如何和何时使用多线程.线程可以大大提高应用程序的可用性和性能,但是当您确定它们将如何与用户界面交互时,需要对其进行非常仔细的考虑. 线程是基本执行单元.单线程执行一系列应用程序指令,并且在应用程序中从头到尾都经由单一的逻辑路径.所有的应用程序都至少有一个线程,

异步调用与线程(总结篇)

委托调用.子线程程调用.与线程池调用1,委托调用(1),同步委托:委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 从下面的例子中可以看到,同步委托的执行是在主线程main中执行的,所以当执行委托时,当前工作会处于等待状态,开始执行委托,当委托执行完后在继续执行“当前工作” public delegate int AddHandler(int i,int y);        private void button1_C

客户端的异步调用

C#客户端的异步操作 阅读目录 开始 示例项目介绍 同步调用服务 异步接口介绍 1. 委托异步调用 2. 使用IAsyncResult接口实现异步调用 3. 基于事件的异步调用模式 4. 创建新线程的异步方式 5. 使用线程池的异步方式 6. 使用BackgroundWorker实现异步调用 客户端的其它代码 各种异步方式的优缺点 异步文件I/O操作 数据库的异步操作 异步设计的使用总结 在Asp.net中使用异步 上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但

Java异步调用转同步的5种方式

1.异步和同步的概念 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 2 .异步转为同步的概率 需要在异步调用过程中,持续阻塞至获得调用结果. 3.异步调用转同步的5种方式 1.使用wait和notify方法 2.使用条件锁 3.Future 4.使用CountDownLatch 5.使用CyclicBarrier 4.构造一个异步调用模型. 我们主要关心call方法,这个方法接收了一个demo参

C#委托异步调用

废话不多说,直接上代码(PS:我就喜欢简单.直接.粗暴) using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Remoting.Messaging;using System.Text;using System.Threading;using System.Threading.Tasks; namespace 异步调用委托{    class Program    {       

cglib实现全配置的异步调用

参考cglib资料:http://www.tuicool.com/articles/IVfANr 实现逻辑为,对service类用cglib包装,让其调用方法改成异步调用,Future.线程池 对service方法的返回对象也用cglib包装,使其带有LazyLoad的功能 主要点:对cglib需要处理的类信息缓存,提高效率,通过lazyload,让用户不需要修改自己的代码,通过配置的方式就能进行异步化调用方法

利用委托实现异步调用

同步调用示例(委托是一个类型安全的,面向对象的指针) using System; using System.Threading; namespace Demo { public delegate int Operate(int x, int y); public class DelegateAsync { static int Add(int a, int b) { Console.WriteLine ("Add() invoked on thread:{0}\n", Thread.C