Processing a large number of files in a folder
You could use Directory.EnumerateFiles to allow processing of each path without loading all the paths to memory.
It is not required to check if the file exists because you just checked that (getting the path with GetFiles).
Instead of implementing your own ReadTextAsync, just use File.ReadAllText.
There is no need to use a new synchronization context (async call) for each file. If you want to process the files in the background, it is better processing all files in one single Task than using one task for each file. Remember that each context switch produces a little overhead.
If you want to use an async API that way, consider using ConfigureAwait(true) to avoid context switches:

await sourceStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(true)



I suppose the following code will do the same faster and with less memory consumption:

static async Task ProcessRead()
{
    await Task.Run(() =&gt;
    {
        IEnumerable&lt;string&gt; fileEntries = Directory.EnumerateFiles(@"Directory");
        int count = 0;
        foreach (string fname in fileEntries)
        {
            try
            {
                count++;
                string text = File.ReadAllText(fname);
                    Console.WriteLine(text);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        Console.WriteLine(count);
    }
}