执行任务的时候有时需要异步和同步,同步的意思是一个任务执行完成后再执行下一个,异步的意思是,A执行后,不管结果,立即开始B任务,
如果使用了await,则必须的是Task类型的函数,定义函数的时候,就需要Task<int>;其中Task是指定了函数返回的任务类型,int是返回值类型,可以是其他的;
public static async void callMethod()
{
Task<int> task = Method1();
int count = await task;
Method2();
Method3(count);
}
public static async Task<int> Method1()
{
int count = 0;
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(" Method 1");
count += 1;
Thread.Sleep(200);
}
});
return count;
}
public static void Method2()
{
for (int i = 0; i < 15; i++)
{
Console.WriteLine(" Method 2");
Thread.Sleep(200);
}
}
public static void Method3(int count)
{
Console.WriteLine("Total count is " + count);
}
}
只能在通过 async 关键字修改的方法、lambda 表达式或匿名方法中使用 await 运算符。 在异步方法中,不能在同步函数的主体、lock 语句块内以及不安全的上下文中使用 await 运算符。
await 运算符的操作数通常是以下其中一个 .NET 类型:Task、Task<TResult>、ValueTask 或 ValueTask<TResult>。 但是,任何可等待表达式都可以是 await 运算符的操作数。 有关详细信息,请参阅 C# 语言规范中的可等待表达式部分。
以上内容是引用的MDSN中的解释原话,我的理解如下,
如果要使用await,则使用的方法,lambda表达式或者其他匿名方法必须使用 async修饰,否则不能使用;
await 运算符,必须再 Task 类型的函数前面,一共有几种,主要用的是Task 无返回值,Task<Tretsult> 两种
可以等等的任务的建立方法
public static async Task<int > Method4()
{
int ret = await Task<int>.Run(() => {
for (int i = 0; i < 15; i++)
{
Console.WriteLine(" Method4");
Thread.Sleep(200);
}
return 1000;
});
return ret;
}
public static async Task Method5()
{
await Task.Run(() => {
for (int i = 0; i < 15; i++)
{
Console.WriteLine(" Method4");
Thread.Sleep(200);
}
});
}