c#-异步编程基础-调用异步方法

本文深入探讨了C#中的异步编程技巧,通过具体的代码示例展示了如何使用Task和async/await关键字来提高程序的响应性和效率。文章还解释了异步方法的调用流程及线程和任务之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;

// c#-异步编程基础-调用异步方法
namespace yibBianchengJichu
{

    class Program
    {
        void traceThreadAndTask(string info)
        {
            string taskInfo = Task.CurrentId == null ? "no task" : "task" + Task.CurrentId;
            Console.WriteLine($"{info} in thread {Thread.CurrentThread.ManagedThreadId} " + $"and {taskInfo}");

        }
        string Greeting(string name)
        {
            traceThreadAndTask($"running {nameof(Greeting)}");
            Task.Delay(3000).Wait();
            return $"hello,{name}";
        }
        Task<string> GreetingAsync(string name) => Task.Run<string>(() => {
            traceThreadAndTask($"running {nameof(GreetingAsync)}");
            return Greeting(name);
        });
        async void CallWhithAsync()
        {
            traceThreadAndTask($"started{nameof(CallWhithAsync)}");
            string result = await GreetingAsync("stephanie");
            Console.WriteLine(result);
            traceThreadAndTask($"ended  {nameof(CallWhithAsync)}");
        }
        async void CallWhithSsync2()
        {
            traceThreadAndTask($"started{nameof(CallWhithSsync2)}");
            Console.WriteLine(await GreetingAsync("stephanie2"));
            traceThreadAndTask($"ended  {nameof(CallWhithSsync2)}");
        }
        // 使用Awaiter
        void CallerWithAwaiter()
        {
            traceThreadAndTask($"started{nameof(CallerWithAwaiter)}");
            TaskAwaiter<string> awaiter = GreetingAsync("Matthias").GetAwaiter();
            awaiter.OnCompleted(OnCompleteAwaiter);
            void OnCompleteAwaiter()
            {
                Console.WriteLine(awaiter.GetResult());
                traceThreadAndTask($"started{nameof(CallerWithAwaiter)}");
            }
        }
        // 延续任务
        void CallerWithContinuationTask()
        {
            traceThreadAndTask($"started{nameof(CallerWithContinuationTask)}");
            var t1 = GreetingAsync("stephanie");
            t1.ContinueWith(t =>
            {
                string result = t.Result;
                Console.WriteLine(result);
                traceThreadAndTask($"ended  {nameof(CallerWithContinuationTask)}");
            });
        }
        // 创建任务-调用异步方法-使用Awaiter-延续任务
        void main()
        {
            //traceThreadAndTask("test");
            //同步任务
            //Greeting("test");
            CallWhithAsync();
            //CallWhithSsync2();
            //CallerWithAwaiter();
            //CallerWithContinuationTask();
            Thread.Sleep(8000);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Program p = new Program();
            p.main();


        }
    }
}

代码分析

函数名称线程id任务id
CallWhithAsync-开始0
GreetingAsync41
Greeting41
CallWhithAsync-结束4

CallWhithAsync 异步调用后线程编程了4,且4是异步任务的线程。

在异步调用时候,创建了任务,并且任务id是1.

执行完任务后,线程不规划,仍然在创建任务的线程中运行,但是任务却没有了。(线程和任务的差别是什么呢?)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值