C#异步方法执行

C#异步方法执行转于http://blog.csdn.net/wanlong360599336/article/details/8781477

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;  

namespace ConsoleApplication1
{
    public delegate int AddHandler(int a, int b);
    public class AddMethod
    {
        public static int Add(int a, int b)
        {
            Console.WriteLine("开始计算:" + a + "+" + b);
            Thread.Sleep(3000); //模拟该方法运行三秒
            Console.WriteLine("计算完成!");
            return a + b;
        }
    }  

    //**************同步调用***********
    //委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。  

    //**************异步调用***********
    //异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。
    //委托的异步调用通过BeginInvoke和EndInvoke来实现。  

    //**************异步回调***********
    //用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。  

    //注意: BeginInvoke和EndInvoke必须成对调用.即使不需要返回值,但EndInvoke还是必须调用,否则可能会造成内存泄漏。
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("===== 同步调用 SyncInvokeTest =====");
            AddHandler handler = new AddHandler(AddMethod.Add);
            int result=handler.Invoke(1,2);
            Console.WriteLine("继续做别的事情。。。");  

            Console.WriteLine(result);
            Console.ReadKey();  

            Console.WriteLine("===== 异步调用 AsyncInvokeTest =====");
            AddHandler handler1 = new AddHandler(AddMethod.Add);
            IAsyncResult result1=handler1.BeginInvoke(1,2,null,null);
            Console.WriteLine("继续做别的事情。。。");  

            //异步操作返回
            Console.WriteLine(handler1.EndInvoke(result1));
            Console.ReadKey();  

            Console.WriteLine("===== 异步回调 AsyncInvokeTest =====");
            AddHandler handler2 = new AddHandler(AddMethod.Add);
            IAsyncResult result2 = handler2.BeginInvoke(1, 2, new AsyncCallback(Callback), null);
            Console.WriteLine("继续做别的事情。。。");
            Console.ReadKey();  

            //异步委托,也可以参考如下写法:
            //Action<object> action=(obj)=>method(obj);
            //action.BeginInvoke(obj,ar=>action.EndInvoke(ar),null);
            //简简单单两句话就可以完成一部操作。
        }
        static void Callback(IAsyncResult result)
        {
            AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;
            Console.WriteLine(handler.EndInvoke(result));
        }
    }
}
时间: 2024-07-30 09:43:40

C#异步方法执行的相关文章

简要异步方法执行方式

.net4.5及以后可以使用 Task.Run(() =>{PrintText(requestData);}); .net4.0及以前 new Thread(() => { SendMail("", Email, "", msg); }).Start();

【WP8】同步执行异步代码

微软的StorageFile只支持异步的方式进行文件操作,我之前也封装过一个StorageHelper,但是当所有的方法都是异步的时候也带来一些问题 1.比如我们不能在构造函数调用异步代码(等待), 2.比如我们在离开App的时候我们需要对数据进行快速的保存(在事件中),这个时候就不适合用异步了,异步可能会导致保存失败,因为App已经不在前台了 最近就遇到了一个这样的需求 我封装了一个SqliteHelper类,提供了一些数据库操作的一些常用方法,在数据库使用之前,需要保证数据库路径的文件夹是存

C#多线程编程之:异步方法调用

异步方法 当一个线程调用方法后,直到方法执行完毕,线程才继续执行,这种方法被称为同步方法.然而,有些方法执行时间可能非常长,比如串口操作或访问网络,这样线程被阻塞,而无法响应用户的其他请求.这种情况通常是无法忍受的,所以这时我们应该使用异步方法. 异步方法的原理是,在方法调用前为异步方法指定一个回调函数,方法调用后被线程池中的一个线程接管,执行该方法.主线程立即返回,继续执行其他工作或响应用户请求.如果异步方法执行完毕,回调函数被自动执行,以处理异步方法的调用结果. 如何实现异步方法呢?C#通过

使用spring的@Async异步执行方法

应用场景: 1.某些耗时较长的而用户不需要等待该方法的处理结果 2.某些耗时较长的方法,后面的程序不需要用到这个方法的处理结果时 在spring的配置文件中加入对异步执行的支持 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.spri

[C#] 异步编程 - 剖析异步方法

剖析异步方法 序 这是上篇<开始接触 async/await 异步编程>(入门)的第二章内容,主要是深入了解异步方法,建议大家先看入门篇,很短. 本文要求了解委托的使用. 目录 介绍异步方法 异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务. 语法分析: (1)关键字:方法头使用 async 修饰. (2)要求:包含 N(N>0) 个 await 表达式,表示需要异步执行的任务. (3)返回类型:只能返回 3 种类型(void.Task 和 Task<T&

UWP开发:异步方法返回集合的数据绑定问题

——最近在做UWP开发,其中请求API数据的时候,往往是通过异步请求网络,再处理json数据,返回集合对象.通常,我们的做法是将集合数据在ViewModel层进行处理,让ViewModel实现ObservableCollection接口,然后在View层后台实例化ViewModel对象,前台绑定对象.这样就实现了集合的绑定和通知.这里需要注意,集合的绑定,不单单是绑定,而且要实现绑定通知,才算真正的绑定. 为什么这么说呢?看一下在开发中遇到的问题: 由于一个简单的页面,需要绑定一组集合数据,因为

[C#并发编程学习笔记].NET 异步操作执行中显示执行进度,并可取消异步操作

在异步方法执行过程中报告进度可以使用Progress<T>类型,创建一个Progress<T>类型的实例,并为它添加报告事件,作为参数传入异步方法中.上代码: 我们需要调用的异步方法: 1 /// <summary> 2 /// 报告进度并且可取消的异步任务 3 /// </summary> 4 /// <param name="token"></param> 5 /// <param name="

C# 异步方法的使用

?  前言 C# 中的异步方法是 C#5.0 才有的新特性,可以在执行当前方法的同时异步的去执行其他方法. ?  什么是异步方法 1)   异步方法,是指在执行当前方法的同时,去执行其他异步方法,但不会阻塞当前方法的线程. 2)   使用了 async 修饰符的方法称为异步方法,通常配合 await 运算符和 Task 异步任务一起使用. 3)   Task 分为两种: 1.   Task,表示可以执行一个异步操作,声明如下: public class Task : IAsyncResult,

C# 5.0 特性之异步方法(AM)

?  前言 C# Asynchronous Programming(异步编程)有几种实现方式,其中 Asynchronous Method(异步方法)就是其中的一种.异步方法是 C#5.0 才有的新特性,主要采用 async.await 关键字声明为异步方法,完成对方法的异步调用.C#5.0 对应的 VS 版本是 VS2012,对应的 .NET Framework 版本是 v4.5,所以需要在此基础上才支持.(否则可能报:找不到"async"修饰符所需的所有类型.目标框架版本是否不正确