StopWatch for users C#
Normally I wouldn't recommend creating a class with almost exactly the same name as a framework class (your StopWatch vs the existing Stopwatch), but you mentioned that this is an exercise, so let's ignore that for now.


The basic approach here seems fine: Start stores the start time, Stop stores the end time, and GetTime returns the difference. But there's a bug: GetTime does not work correctly if the stopwatch is still running. In that case, instead of looking at the (incorrect) stop time, it should look at the current time.
Why do Start and Stop take a DateTime as argument? That's something that the stopwatch itself should be doing. If, for some reason, you really must allow calling code to pass in their own times, then your stopwatch class should probably verify that the stop time is not earlier than the start time.
Why does Start throw an exception if the stopwatch is already running? Is that really something that should not be allowed? If so, why is it allowed to call Stop on a stopped stopwatch? I see no real reason for this inconsistency.
If starting a running stopwatch is not allowed, why can't a caller determine whether a stopwatch is running? A read-only IsRunning property that returns _timeRunning would be useful.
As you know, there's already a Stopwatch class in System.Diagnostics, so I would encourage you to look at its source code. You'll see several differences. One in particular is that it remembers the total elapsed time across multiple start/stop calls. Related to that are the Reset and Restart methods, and there's a convenient static StartNew method. It also uses lower-level methods for more accurate timing.