I would like to propose my vision that may differ from purpose of your code. But it could introduce some new points that could help to find the best solution.
My vision is that process is an OS part. So the one question is how much memory OS allocated for the process. OS calls or external tools could be helpful here.
In other hand memory consumption in systems with automatic memory management (Garbage Collection) is depends on many factors. In one case application can produce much not handled objects and GC do not release them. In other case GC can release memory aggressively. So GC should be taken into consideration as active part.
Besides all GC runs its own processes. So if you want to assess whole application memory consumption, the better considering measuring memory in more wide context, but not for one process.
I use GC information to assess memory consumption - memory available and number of collecting actions. It is some rough evaluation but could be useful for some cases. My codes (for example / also platform independent):
memory = GC.GetTotalMemory(true);
int gccounts = new int[GC.MaxGeneration + 1];
for (int i = 0; i <= GC.MaxGeneration; i++)
gccounts[i] = GC.CollectionCount(i);