c#复习笔记-异步方法

 同步是操作完成以后再返回给调用者,异步大部分工作是返回给调用者以后完成的。编写异步函数,可以将返回值类型有Void改为Task。这样方法就可以异步调用,可以等待的,其他方面不需要修改。如:
        public async Task Print()
        {
            await Task.Delay(100);
            var number = 20 * 20;
            Console.WriteLine(number);
        }

1、Task<T>,返回一个T类型的值,异步方法的返回值必须是TasK<T>,从Task的Result获取T的返回值。

public static Task<int> AddAsync(int n, int m)
{
    return Task.Run(() => { return n + m; });
}
 //调用
var t = Calculator.AddAsync(1, 2);//有返回值
Console.WriteLine($"Result:{t.Result}");
2、Task,调用方法不需要从异步方法中取返回值,但是希望检查异步方法的状态,那么可以选择可以返回 Task 类型的对象。
public static async Task AddAsync(int n, int m, int t)
{
   var value = await Task.Run(() => { return n + m + t; });
   Console.WriteLine($"{n}+{m}+{t}={value}");
}
Task t2 = Calculator.AddAsync(1, 2, 3);
await Calculator.AddAsync(1, 2, 3);
Console.WriteLine("执行完毕!");
3、Void,调用异步方法,但需要进一步的交互。
public class WriteToText
{
    public static async void WriteHtml()
    {
        using (HttpClient client = new HttpClient())
        {
            string htmlString = await client.GetStringAsync("https://cn.bing.com/");
            await File.WriteAllTextAsync("D:\\writeHtml.txt", htmlString);
            Console.WriteLine("写入完毕!");
        }
    }
}
4、取消异步请求
CancellationToken 对象包含任务是否被取消的信息;如果该对象的属性 IsCancellationRequested 为 true,任务需停止操作并返回。
CancellationTokenSource 可创建 CancellationToken 对象,调用 CancellationTokenSource 对象的 Cancel 方法,会使该对象的 CancellationToken 属性 IsCancellationRequested 设置为 true。
public static async Task WriteHtml(CancellationToken token)
    {
        using (HttpClient client = new HttpClient())
        {
            string htmlString = await client.GetStringAsync("https://cn.bing.com/");
            await File.WriteAllTextAsync("D:\\writeHtml.txt", htmlString);
            if (token.IsCancellationRequested)
            {
                //执行取消操作
                 Console.WriteLine("异步操作已取消!");
                    return;
            }
            Console.WriteLine("写入完毕!");
        }
    }
    CancellationTokenSource cts = new CancellationTokenSource();
var token=cts.Token;
Task t= WriteToText.WriteHtml(token);
Thread.Sleep(1000);//超过1秒钟没执行完则取消操作
cts.Cancel();
t.Wait();
5、Task.Delay(),暂停执行
Task.Delay() 方法会创建一个 Task 对象,该对象将暂停其在线程中的处理,并在一定时间之后完成。Task.Delay是 Thread.Sleep 的异步版本,它不会阻塞线程,意味着线程可以继续处理其它工作。
 public static async Task   WriteHtml()
    {
        using (HttpClient client = new HttpClient())
        {
            int count = 0;
            while (true)
            {
                string htmlString = await client.GetStringAsync("https://cn.bing.com/");
                await File.AppendAllTextAsync("D:\\writeHtml.txt", htmlString);
                Console.WriteLine($"写入完毕!{count++}");
                await Task.Delay(2000);//每2秒中循环一次
            }
        }
    }
    await WriteToText.WriteHtml();

 

posted @ 2023-04-02 00:26  放羊娃  阅读(55)  评论(0编辑  收藏  举报