I think it is a fairly common requirement to develop applications such that only a single instance runs at a time. This is where Mutexes, an inter-process thread synchronization primitive comes into picture. This is one good example where no other WaitHandle, but Mutexes only can be employed. For the implementation details, you can refer to Jon Skeet's most excellent C# FAQ
.
I believe another way is to check if Process.GetProcessByName(“<<App Name>>“) returns a non-empty array. This approach may work fine, but I don't seem to like this personally.
Come Whidbey, you need not bother about using any of the above methodologies, as this is as easy as setting a project property!