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();
从别后, 忆相逢, 几会魂梦与汝同。