c# 異步方法(Action,Func)


    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"主線程:{Thread.CurrentThread.ManagedThreadId}");

            var obj = new MyTestClass();
            obj.TaskFinished += Obj_TaskFinished;
            obj.CallWithSync(5); //同步方式
            obj.CallWithAsyncAction(10); //異步方式,但不用獲取異步方法的返回值
            obj.CallWithAsyncFunc(10);
            obj.CallWithAsync2Func(10);//異步方式,需要獲取異步方法的返回值

            Console.ReadKey();
        }

        private static void Obj_TaskFinished(int value)
        {
            Console.WriteLine($"事件回調,線程:{Thread.CurrentThread.ManagedThreadId}, 運行結果:{value}");
        }
    }

    public class MyTestClass
    {
        public event Action<int> TaskFinished;

        private void BusyTaskFunction(int value)
        {
            Console.WriteLine("-----------------");
            Console.WriteLine($"任務開始,線程:{Thread.CurrentThread.ManagedThreadId}");
            for (int i = 0; i < 30; i++)
            {
                Thread.Sleep(100);
            }
            Console.WriteLine($"BusyTaskFunction 運行完成。value={value}---------------");
        }

        private int BusyTaskFunction2(int value)
        {
            int v = value * value;
            Console.WriteLine("-----------------");
            Console.WriteLine($"任務開始,線程:{Thread.CurrentThread.ManagedThreadId}");
            for (int i = 0; i < 30; i++)
            {
                Thread.Sleep(100);
            }
            Console.WriteLine($"BusyTaskFunction 運行完成。value={v}---------------");
            return v;
        }

        public void CallWithSync(int value)
        {
            BusyTaskFunction(value);
        }

        /// <summary>
        /// 不用獲取異步方法的返回值
        /// </summary>
        /// <param name="value"></param>
        public void CallWithAsyncAction(int value)
        {
            Action<int> action = new Action<int>(BusyTaskFunction);
            action.BeginInvoke(value,
                o =>
                {
                    Console.WriteLine($"線程:{Thread.CurrentThread.ManagedThreadId} 任務結束,想干啥就干啥。");
                    TaskFinished?.Invoke(value);
                    Console.WriteLine($"======================================");
                },
                null
                );
        }

        public void CallWithAsyncFunc(int value)
        {
            Func<int, int> func = new Func<int, int>(BusyTaskFunction2);
            func.BeginInvoke(value,
                o =>
                {
                    Console.WriteLine($"線程:{Thread.CurrentThread.ManagedThreadId} 任務結束,想干啥就干啥。");
                    TaskFinished?.Invoke(value);
                    Console.WriteLine($"======================================");
                },
                null
                );
        }

        /// <summary>
        /// 去獲取異步方法的返回值
        /// </summary>
        /// <param name="value"></param>
        public void CallWithAsync2Func(int value)
        {
            Func<int, int> func = new Func<int, int>(BusyTaskFunction2);
            IAsyncResult ar = func.BeginInvoke(value,
                  o =>
                  {
                      int v1 = func.EndInvoke(o);
                      Console.WriteLine($"線程:{Thread.CurrentThread.ManagedThreadId} 任務結束,想干啥就干啥。得到返回值{v1}");
                      TaskFinished?.Invoke(v1);
                      Console.WriteLine($"======================================");
                  },
                  this
                  );
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM