Task.WhenAll、Task.WhenAny用法:
1.Task.WhenAll,所有Task完成,Task才完成,用于等待多个任务执行结束,但是不在乎它们的执行顺序。
2.Task.WhenAny,任何一个Task完成,Task就完成。
准备一个文件夹TEMP,里面新建两个文本文件,并在文件中写入一些内容
其中1.txt中的文本长度为11,2.txt中文本内容长度为10
代码示例:获取文件夹中所有文件内容字符长度之和(Task.WhenAll)
static async Task Main(string[] args)
{
string[] files = Directory.GetFiles(@"C:\TEMP");
Task<int>[] countTasks = new Task<int>[files.Length];
for (int i = 0; i < files.Length; i++)
{
string filename = files[i];
Task<int> t = ReadCharsCount(filename);
countTasks[i] = t;
}
int[] counts = await Task.WhenAll(countTasks);//Task<TResult[]>
int c = counts.Sum();
Console.WriteLine(c);
}
/// <summary>
/// 获取文件中字符个数
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
static async Task<int> ReadCharsCount(string filename)
{
string s = await File.ReadAllTextAsync(filename);
return s.Length;
}
执行结果:
代码示例:获取文件夹中任一文件内容字符长度(Task.WhenAny)
static async Task Main(string[] args)
{
string[] files = Directory.GetFiles(@"C:\TEMP");
Task<int>[] countTasks = new Task<int>[files.Length];
for (int i = 0; i < files.Length; i++)
{
string filename = files[i];
Task<int> t = ReadCharsCount(filename);
countTasks[i] = t;
}
Task<int> counts = await Task.WhenAny(countTasks);//Task<Task<TResult>>
Console.WriteLine(counts.Result);
}
/// <summary>
/// 获取文件中字符个数
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
static async Task<int> ReadCharsCount(string filename)
{
string s = await File.ReadAllTextAsync(filename);
return s.Length;
}
执行结果:
获取到了1.txt中的字符串长度。
Task.WhenAll、Task.WhenAny都有多个重载方法,可以根据实际需要情况调用不同的重载方法。