BeginInvoke()使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Client application is starting!");
            Thread.CurrentThread.Name = "Main Thread";
            Cal cal = new Cal();
            AddDelegate del = new AddDelegate(cal.Add);

            // 需要保存 IAsyncResult 对象以便后边条用EndInvoke方法时作参数传递
            IAsyncResult asyncResult = del.BeginInvoke(5, 6, null, null);

            // 做某些其它的事情,模拟需要执行 3 秒钟
            for (int i = 1; i <= 3; i++)
            {
                Thread.Sleep(TimeSpan.FromSeconds(i));
                Console.WriteLine("{0}: Client executed {1} second(s).", Thread.CurrentThread.Name, i);
            }

            // 传递 IAsyncResult 对象
            int rtnVal = del.EndInvoke(asyncResult);
            Console.WriteLine("Result: {0}\n", rtnVal);

            Console.WriteLine("\nPress any key to exit...");
            Console.ReadLine();

        }

        public delegate int AddDelegate(int a, int b);

        public class Cal
        {
            public int Add(int a, int b)
            {
                if (Thread.CurrentThread.IsThreadPoolThread)
                {
                    Thread.CurrentThread.Name = "Pool Thread";
                }
                Console.WriteLine("Method invoked!");

                // 做某些其它的事情,模拟需要执行 2 秒钟
                for (int i = 0; i < 2; i++)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                    Console.WriteLine("{0}: Add executed {1} second(s).", Thread.CurrentThread.Name, i);
                }
                Console.WriteLine("Method complete!");
                return a + b;
            }
        }
    }
}
时间: 2024-10-28 21:30:27

BeginInvoke()使用的相关文章

多线程 异步 beginInvoke EndInvoke 使用

有许多耗时操作时,还要响应用户操作.这时候就需要用其他线程或者异步来搞.本来是改造公司的日志组件.因为多上了个国外大区的业务到来本系统来.这个系统其他地方都好就是日志,动不动就要死给我们看.有时候寻找业务流程时缺失了一块日志,令人欲仙欲死.刚好年末了没什么业务上线,决定改造日志.前人栽树后人心凉.本着我不入地狱谁入地狱的精神,折腾完了这个日志.发现线程的有些地方处理的不好.顺带给自己留个念想谢谢异步或者多线程的东西.有错误欢迎指正. beginInvoke EndInvoke 使用 1. 使用历

Invoke与BeginInvoke

一.为什么 Control类提供了 Invoke和 BeginInvoke机制? 关于这个问题的最主要的原因已经是 dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己. 1. windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵.这个消息泵让 windows程序生生不息. Windows GUI 程序的消息循环 Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的 while循环使

C#如何使用异步编程【BeginInvoke/EndInvoke】

怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法.委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用. 异步有三种模式 等待模式,在发起了异步方法以及做了一些其它处理之后,原始线程就中断,并且等待异步方法完成之后再继续. 轮询模式,原始线程定期检查发起的线程是否完成,如果没有则可以继续做一些其它的事情. 回调模式,原始线程一直在执行,无需等待或检查发起的线程是否完成.在发起的线程中的引用方法完成之后,发起的线程

普通方法调用,Invoke,begininvoke三者的区别总结

(1)普通方法调用(直接调用)与Invoke()方法调用方法 使用的线程Id是一样的 即属于同步. (2)BeginInvoke(<输入和输出变量>,AsyncCallback callback,object asyncState)方法调用方法 则是启用了新的线程Id       属于异步 可通过 Thread.CurrentThread.ManagedThreadId    获取当前线程的Id *委托类型的BeginInvoke(<输入和输出变量>,AsyncCallback c

C#中Control的Invoke和BeginInvoke是相对于支线线程

近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下. Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行. (一)Control的Invoke和BeginInvoke我们要基于以下认识:(1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不

BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较

  速度(最快为1) 返回值 多参数 等待在时限内完成 超时后结束 ThreadPool.UnsafeQueueUserWorkItem() 1 非原生支持1 非原生支持 非原生支持3 不支持 ThreadPool.QueueUserWorkItem() 2.7 非原生支持1 非原生支持 非原生支持3 不支持 Task() 4.5 支持2 非原生支持 支持 自愿结束 Delegate.BeinInvoke() 25.4 非原生支持1 支持 支持4 不支持 Thread.Start() 11009

BeginInvoke和EndInvoke操作和方法

开发语言:C#3.0 IDE:Visual Studio 2008 一.C#线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一个进程中开启多个线程.我们使用C#编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开windows任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示. 如果任务管理器没有“线程数”列,可以[查看]>[选择列]来显

[C#学习笔记之异步编程模式2]BeginInvoke和EndInvoke方法 (转载)

为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了.异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了.异步调用并不是要减少线程的开销, 它的主要目的是让调用方法的主线程不需要同步等待在这个函数调用上, 从而可以让主线程继续执行它下面的代码. BeginInvoke方法可以使用线程异步

BeginInvoke与Invoke的区别

简单的讲就是 BeginInvoke不需要等待方法运行完毕,就会继续执行下面的代码 Invoke则必须等待Invoke中的代码运行完毕,才会继续执行下面的代码. 可以通过下面的项目测试上面所描述的观点. 在代码中的一段代码如下: 1 /// <summary> 2 /// Sub thread function 3 /// </summary> 4 private void ThreadFun() 5 { 6 MethodInvoker mi = new MethodInvoker