“Proper” Asynchronous implementation
Well, you start two Tasks each reading and writing a file but not the same. So basically it should be ok. Some remarks:


Task.Factory.StartNew returns a Task. You probably want to wait until the tasks you have started are finished before you quit from main which you can do with Task.WaitAll. Something along these lines:

var task1 = Task.Factory.StartNew(() =&gt; ReadCharacter("File 1.txt"));
var task2 = Task.Factory.StartNew(() =&gt; ReadCharacter("File 2.txt"));
Console.WriteLine("Main - waiting for tasks to finish");
Task.WaitAll(task1, task2);         
Console.WriteLine("Finished");

Your worker method ReadCharacter writes directly to the console. What happens if you want to run this code in a windows service process where this should be logged instead? So you should pass some kind of ILogger to the method and use that to output the status/log messages.
You hard-code your output directory to C:\. This should really be passed in as destination folder.