I've been trying to make an asynchronous MergeSort for fun. I quickly threw the program together before noticing that the program runs on a single thread.
After a little investigation I found out that you need to use the Task.WhenAll()
method. Often the place to put it was fairly obvious in the examples I've seen but with the recursive nature of my program it wasn't clear to me where to put it.
class Sorter
{
public static async Task<List<int>> MergeSortAsync(List<int> numbersToSort)
{
if (numbersToSort.Count <= 1)
{
return numbersToSort;
}
var numbers1 = new List<int>();
var numbers2 = new List<int>();
for (int i = 0; i < numbersToSort.Count / 2; i++)
{
numbers1.Add(numbersToSort.ElementAt(i));
}
for (int i = numbersToSort.Count / 2; i < numbersToSort.Count; i++)
{
numbers2.Add(numbersToSort.ElementAt(i));
}
numbers1 = await MergeSortAsync(numbers1);
numbers2 = await MergeSortAsync(numbers2);
return Merge(numbers1, numbers2);
}
private static List<int> Merge(List<int> numbers1, List<int> numbers2)
{
int index1 = 0;
int index2 = 0;
var result = new List<int>();
while (index1 < numbers1.Count || index2 < numbers2.Count)
{
if (index1 < numbers1.Count && index2 < numbers2.Count)
{
if (numbers1[index1] < numbers2[index2])
{
result.Add(numbers1[index1]);
index1++;
}
else
{
result.Add(numbers2[index2]);
index2++;
}
}
else if (index1 < numbers1.Count)
{
result.Add(numbers1[index1]);
index1++;
}
else if (index2 < numbers2.Count)
{
result.Add(numbers2[index2]);
index2++;
}
}
return result;
}
}
Is it even possible to run a recursive method like this on multiple threads?