Самая простая вещь сделать отметить Ваши объекты с сериализуемым атрибутом и затем использовать бинарный форматтер для обработки сериализации. Весь график класса не должен быть проблемой при условии, что любые содержащие в нем объекты также отмечены как сериализуемые.
Статические методы не по своей сути потокобезопасные. CLR обрабатывает их не иначе, чем методы экземпляра. Разница в том, что обычно нужно попытаться сделать их поточно-ориентированными. (Я не могу придумать никаких статических методов .NET BCL, которые не являются потокобезопасными.) Методы экземпляра часто не являются потокобезопасными, потому что типичный шаблон заключается в создании объекта и его многократном использовании из одного потока, и если он действительно ли должен использоваться из нескольких потоков, необходимая координация включает в себя обеспечение безопасного использования объекта. В очень многих случаях это более уместно делать в координирующем коде, чем в самом объекте. (Обычно вы хотите, чтобы целые последовательности операций были эффективно атомарными - то, что нельзя сделать внутри объекта. )
Ваш класс Timer
определенно не является потокобезопасным: два потока могут легко перехватывать данные друг друга, и ничто не мешает потоку использовать «устаревшие» данные при вычислении продолжительности.
Используйте вместо него класс Stopwatch
- вот для чего он нужен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер
тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)
Вместо этого используйте класс Stopwatch
- вот для чего он нужен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер
тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)
Вместо этого используйте класс Stopwatch
- вот для чего он нужен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер
тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)
Секундомер
тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...) для чего это нужно. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер
тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...) Да, вы правы, статические члены / аксессоры этого класса заставят их перезаписывать разные пользователи.
Вот почему у вас есть экземпляры и нестатические члены.
Ваш класс таймера определенно не является потокобезопасным. Вы должны создать обычный класс и создавать его экземпляр каждый раз, когда вам нужно измерить время:
Timer timer = new Timer();
timer.Start();
//...
timer.Stop();
decimal duration = timer.Duration();
Еще лучше, есть встроенный класс .NET, который делает именно это:
Stopwatch sw = Stopwatch.StartNew();
sw.Stop();
TimeSpan duration = sw.Elapsed;