I just wonder whether a race condition occurs in the code below:
int readingFiles;
async Task ReadFile (string file)
{
++readingFiles;
There is no race condition here. The .NET runtime will insert the appropriate memory barriers.
Also see the comments on: http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx
Yes, TPL includes the appropriate barriers when tasks are queued and at the beginning/end of task execution so that values are appropriately made visible.