C#异步编程方式以及示例

1 篇文章 0 订阅
1 篇文章 0 订阅

C#异步编程,这里列举一下几种方式:

1、通过委托来实现异步(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法);

2、task(.net 4.0 新特性);

3、await async (.net4.5新特性);

下面看示例:

一、通过委托来实现异步

class Program
    {        
        static void Main(string[] args)
        {
            //通过委托来实现异步编程的(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法)
            string i = "参数";
            Console.WriteLine("调用异步方法前");
            PostAsync(i);
            Console.WriteLine("调用异步方法后");          

            Console.ReadKey();
        }

        #region 通过委托来实现异步编程的(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法)
          
        delegate void AsyncFoo(string i);
        private static void PostAsync(object i)
        {
            AsyncFoo caller = Myfunc;
            caller.BeginInvoke(i.ToString(), FooCallBack, caller);
        }

        //回调方法
        private static void FooCallBack(IAsyncResult ar)
        {
            var caller = (AsyncFoo)ar.AsyncState;
            caller.EndInvoke(ar);
        }

        /// <summary>
        /// 执行业务逻辑的方法
        /// </summary>
        /// <param name="i">调用异步时传过来的参数</param>
        private static void Myfunc(string i)
        {
            Console.WriteLine("通过委托来实现异步编程的");
        }

        #endregion
    }

运行结果(打印结果):


注意:PostAsync()方法也可以定义为包含两个以及两个以上的参数的方法如下:

class Program
    {        
        static void Main(string[] args)
        {
            PostAsync("参数1", "参数2");

            Console.ReadKey();
        }
                
        delegate void AsyncFoo(string i, string p);
        private static void PostAsync(string i, string p)
        {
            AsyncFoo caller = Myfunc;

            //FooCallBack,caller为额外的参数
            caller.BeginInvoke(i, p, FooCallBack, caller);
        }

        private static void FooCallBack(IAsyncResult ar)
        {
            var caller = (AsyncFoo)ar.AsyncState;
            caller.EndInvoke(ar);
        }

        private static void Myfunc(string i,string p)
        {
            Console.WriteLine(i);
            Console.WriteLine(p);
        }
    }


二、task(.net 4.0 新特性)

class Program
    {        
        static void Main(string[] args)
        {
            Console.WriteLine("主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId);
            //Task方式一
            Task task1 = new Task(() => TaskFunc1());
            task1.Start();

            //Task方式二
            var result = Task.Run<string>(() => { return TaskFunc2(); });
            Console.WriteLine(result.Result);

            Console.ReadKey();
        }
        
        #region task

        private static void TaskFunc1()
        {
            Console.WriteLine("Task方式一开启的线程ID:" + Thread.CurrentThread.ManagedThreadId);
        }

        private static string TaskFunc2()
        {
            return "Task方式二开启的线程ID:" + Thread.CurrentThread.ManagedThreadId;
        }

        #en

运行结果(打印结果):



三、await async (.net4.5新特性)

class Program
    {        
        static void Main(string[] args)
        {
            Console.WriteLine("主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId);
            var result1 = AsyncFunc1();
            Console.WriteLine(result1.Result);

            Console.ReadKey();
        }

        #region await async
        private static async Task<string> AsyncFunc1()
        {
            return await Task.Run(() =>
            {
                Console.WriteLine("await/async线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
                return "这是返回值";
            });

        }
        #endregion
    }

运行结果(打印结果):



代码下载:https://download.csdn.net/download/coderk2014/10536843

C#中,事件是一种用于实现发布-订阅模式的机制。当某个特定的事件发生时,所有订阅了该事件的处理程序都会被触发。在C# 5.0引入async和await关键字之前,所有的事件处理器通常都是同步执行的。然而,引入了这些异步编程工具后,我们可以在事件处理器中使用它们来执行异步操作,而不会阻塞主线程。 下面是一个简单的示例,展示了如何在一个C#事件处理器中添加异步代码: ```csharp public class Publisher { // 定义一个事件 public event EventHandler MyEvent; // 引发事件的方法 public void OnMyEvent() { MyEvent?.Invoke(this, EventArgs.Empty); } // 异步操作方法 public async Task PerformAsyncOperation() { // 这里可以放置异步操作代码,例如网络请求、文件IO等 // 使用 await 关键字等待异步操作完成 await Task.Delay(1000); // 假设这是一个耗时的异步操作,延迟1秒钟 } } public class Subscriber { public async void OnMyEvent(object sender, EventArgs e) { Publisher publisher = sender as Publisher; if (publisher != null) { // 在事件处理器中使用await进行异步调用 await publisher.PerformAsyncOperation(); // 异步操作完成后的代码 Console.WriteLine("异步操作完成,事件处理完毕。"); } } } class Program { static void Main(string[] args) { Publisher publisher = new Publisher(); Subscriber subscriber = new Subscriber(); // 订阅事件 publisher.MyEvent += subscriber.OnMyEvent; // 触发事件 publisher.OnMyEvent(); // 等待用户输入,防止程序立即退出 Console.ReadLine(); } } ``` 在这个示例中,`Publisher`类有一个`MyEvent`事件,一个`OnMyEvent`方法用来触发事件,以及一个`PerformAsyncOperation`异步方法。`Subscriber`类订阅了`Publisher`的事件,并在事件处理器`OnMyEvent`中使用了`await`来调用`Publisher`的异步方法。 请注意,在编写异步事件处理器时,需要确保事件处理器本身不产生任何副作用,因为异步事件处理器可能会被不同的线程同时调用,从而引发线程安全问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值