Ориентированные на многопотоковое исполнение статические методы

Самая простая вещь сделать отметить Ваши объекты с сериализуемым атрибутом и затем использовать бинарный форматтер для обработки сериализации. Весь график класса не должен быть проблемой при условии, что любые содержащие в нем объекты также отмечены как сериализуемые.

57
задан Mo Patel 17 April 2013 в 08:59
поделиться

3 ответа

Статические методы не по своей сути потокобезопасные. CLR обрабатывает их не иначе, чем методы экземпляра. Разница в том, что обычно нужно попытаться сделать их поточно-ориентированными. (Я не могу придумать никаких статических методов .NET BCL, которые не являются потокобезопасными.) Методы экземпляра часто не являются потокобезопасными, потому что типичный шаблон заключается в создании объекта и его многократном использовании из одного потока, и если он действительно ли должен использоваться из нескольких потоков, необходимая координация включает в себя обеспечение безопасного использования объекта. В очень многих случаях это более уместно делать в координирующем коде, чем в самом объекте. (Обычно вы хотите, чтобы целые последовательности операций были эффективно атомарными - то, что нельзя сделать внутри объекта. )

Ваш класс Timer определенно не является потокобезопасным: два потока могут легко перехватывать данные друг друга, и ничто не мешает потоку использовать «устаревшие» данные при вычислении продолжительности.

Используйте вместо него класс Stopwatch - вот для чего он нужен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)

два потока могут легко обрабатывать данные друг друга, и ничто не мешает потоку использовать «устаревшие» данные при вычислении продолжительности.

Вместо этого используйте класс Stopwatch - вот для чего он нужен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)

два потока могут легко обрабатывать данные друг друга, и ничто не мешает потоку использовать «устаревшие» данные при вычислении продолжительности.

Вместо этого используйте класс Stopwatch - вот для чего он нужен. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)

для чего это нужно. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)

для чего это нужно. По общему признанию, если вы хотите использовать один экземпляр из нескольких потоков, вам нужно будет предпринять обычные шаги для обеспечения безопасности, но в целом вы будете в гораздо лучшем положении. По общему признанию Секундомер тоже далек от совершенства - см. этот вопрос и комментарий ниже для более подробной информации - но, по крайней мере, он предназначен для этого типа. (Кто знает, может быть, когда-нибудь это исправят ...)

66
ответ дан 24 November 2019 в 19:31
поделиться

Да, вы правы, статические члены / аксессоры этого класса заставят их перезаписывать разные пользователи.

Вот почему у вас есть экземпляры и нестатические члены.

5
ответ дан 24 November 2019 в 19:31
поделиться

Ваш класс таймера определенно не является потокобезопасным. Вы должны создать обычный класс и создавать его экземпляр каждый раз, когда вам нужно измерить время:

Timer timer = new Timer();

timer.Start();
//...
timer.Stop();

decimal duration = timer.Duration();

Еще лучше, есть встроенный класс .NET, который делает именно это:

Stopwatch sw = Stopwatch.StartNew();

sw.Stop();

TimeSpan duration = sw.Elapsed;
20
ответ дан 24 November 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: