首页 > 代码库 > 浅析C# 异步编程的两种方式

浅析C# 异步编程的两种方式

一.传统BeginInvoke方式.

    BeginInvoke方法用于启动c#异步调用.它返回IasyncResult,可用于监视调用进度.EndInvoke方法用于检索c#异步调用结果.

调用BeginInvoke后可随时调用EndInvoke方法;如果C#异步调用未完成,EndInvoke将一直阻塞到C#异步调用完成.   

总结其使用大体分5个步骤:

1.声明委拖

2.创建异步方法

3.实例化委拖(把委拖与方法关联)  A

4.通过实例的BeginInvoke调用异步方法

5.通过实例的EndInvoke结束异步调用方法

实例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncAndAwait
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        //1.声明一委托
        public delegate void Ass();

        //2.创建异步方法
        private void Event1()
        {
            Console.WriteLine("Event1 Start");
            System.Threading.Thread.Sleep(4000);
            Console.WriteLine("Event1 End");
        }

         private void button1_Click(object sender, EventArgs e)
         {
             //3.实例委拖(关联方法)
             Ass MyAss = new Ass(Event1);
             //4.通过实例的BeginInvoke调用异步方法
             IAsyncResult ia = MyAss.BeginInvoke(null, null);
             //5.通过实例的EndInvoke结束异步调用方法
             MyAss.EndInvoke(ia);

         }
    }
}

二.net 4.5引入了使用两个新的关键字async和await异步调用的方法

Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NET Framework

或Windows Runtime的资源创建一个异步方法如同你创建一个同步的方法一样容易。通过使用async和await

定义的异步方法,这里被称为异步方法。

下面的例子显示了一个异步方法。代码中的几乎所有的东西你看起来应该非常熟

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncAndAwait
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        //声明异步方法
        private async Task<int>  Event1()
        {
            Console.WriteLine("Start");
            await Task.Delay(4000);
            Console.WriteLine("End");
            return 2;
        
        }


       
        private async void button1_Click(object sender, EventArgs e)
        {
            //调用异步方法--方式1
            int Back= await Event1();
            MessageBox.Show(Back.ToString());
            //调用异步方法--方式2
            Task<int> Back1 = Event1();
            //// 你可以做一些不依赖于返回值的操作.
            int Back2 = await Back1;
            MessageBox.Show(Back2.ToString());
        }
    }
}

上例在Event1方法中用到了await Task.Delay(100)这条语句,这是为了让AsyncWork成为异步方法才加的,

如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例: 

   

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AsyncAndAwait
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        //声明异步方法
        //如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例:
        private async Task<int> Event1()
        {
            int inPut = 4000;
            Console.WriteLine("Event1 Start");
            await Task.Factory.StartNew((Func<object, int>)Event2, inPut);
            Console.WriteLine("Event1 End");
            return 2;
        }

        //同步方法,不支持await修饰,如果要异步调用输入参数只能是object类型,需要进行类型转化
        private int Event2(object input)
        {
            int val = (int)input;

            System.Threading.Thread.Sleep(val);
            return 2;
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            ////调用异步方法--方式1
            //int Back = await Event1();
            //MessageBox.Show(Back.ToString());
            //调用异步方法--方式2
            Task<int> Back1 = Event1();
            //// 你可以做一些不依赖于  返回值的操作.
            int Back2 = await Back1;
            MessageBox.Show(Back2.ToString());

        }
    }
}