C#同步异步方法互调(.NET Fromework 4.6.1)

海阔天空XM / 2023-08-03 / 原文

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 同步异步互调
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Program();
            p.DoSyncWork();// 同步方法调用异步方法
            Task s = p.DoAsyncWork(); // 异步调用同步
            s.Wait();// 上一句是异步,必须等待,否则异步还没执行完,主main就已经结束了
            //Console.ReadKey();

        }

        /// <summary>
        /// 一个同步方法 如何调用异步
        /// </summary>
        public void DoSyncWork()
        {
            // 创建异步任务
            Task<int> asyncTask = SomeAsyncMethod();

            //同步等待任务完成
            asyncTask.Wait();

            // 获取异步操作的结果
            int result = asyncTask.Result;

            // 在这里继续处理结果...


        }
        // 虚拟的异步方法
        public async Task<int> SomeAsyncMethod()
        {
            // 使用异步操作等待一段时间,模拟真实的异步计算
            await Task.Delay(1000);

            // 返回一些异步计算的结果
            return 42;
        }


        // 异步调用同步
        public async Task DoAsyncWork()
        {
            await Task.Run(() =>
            {
                // 执行同步代码...
                var r = SyncMethod();

                // 注意:避免在同步操作中使用阻塞调用,以免降低异步代码的性能
                Console.WriteLine($"{r}");
            });

            // 继续执行异步操作或处理结果...
        }

        // 同步耗时方法 
        public string SyncMethod()
        {
            Thread.Sleep(3000);
            Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}");
            return "完成";
        }
    }
}