Статические методы не являются по существу поточно-безопасный. С их помощью они не обрабатываются иначе, чем методы экземпляров. Разница заключается в том, что обычно следует попытаться сделать , сделав их поточно-безопасными. (Я не могу думать о каких-либо статических методах .NET BCL, которые не являются потокобезопасными.) Методы экземпляров часто не являются потокобезопасными, потому что типичный шаблон заключается в создании объекта и его повторном использовании из одного потока, и если он должен использоваться из нескольких потоков, при этом координация включает в себя обеспечение безопасного использования объекта. В очень многих случаях это более целесообразно делать в координирующем коде, чем в самом объекте. (Обычно вы хотите, чтобы целые последовательности операций были фактически атомарными - что-то, что невозможно сделать в объекте.)
Ваш класс Timer
определенно не является потокобезопасным: две нити могут топать друг на друга с легкостью , и нет ничего, чтобы остановить поток от использования «устаревших» данных при расчете продолжительности.
Вместо этого используйте класс Stopwatch
- вот для чего он предназначен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно предпринять обычные шаги для обеспечения безопасности, но вы будете в гораздо лучшем положении в целом. По общему признанию, Stopwatch
далек от совершенства - см. this question и комментарий ниже для более подробной информации - но это, по крайней мере, то, для чего предназначен тип. (Кто знает, это может быть исправлено некоторое время ...)
MSDN: «Хотя экземпляр класса содержит отдельную копию всех полей экземпляра класса, есть только одна копия каждого статического поля». – colithium