Подтвердить что ты не робот

Включает ли статический метод свои локальные переменные и что происходит при одновременном использовании из разных потоков?

С# Вопрос. Я пытаюсь определить, можно ли использовать статический метод, когда внутри метода он использует некоторые локальные переменные, которые он использует. Локальные переменные "разделяются" между способами использования метода? Что происходит, например, если статический метод вызывается/используется одновременно из разных потоков? Разделяет ли один поток, пока другой не будет завершен и т.д.?

Возможно, обобщенный вопрос в поточном приложении, когда нужно "не" использовать статический метод?

4b9b3361

Ответ 1

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

Однако, если сам метод использует статические переменные, вы должны использовать соответствующую защиту MT. Кроме того, внешние методы, которые вы можете вызвать, должны быть безопасными...

Ответ 2

Являются ли локальные переменные "разделяемыми" между способами использования метода?

Нет, это не так. Каждый поток, выполняющий этот метод, имеет свою собственную копию локальных переменных, и они независимы друг от друга. Когда метод возвращается, конкретная копия locals для этого конкретного потока отбрасывается. (*)

Что происходит, например, если статический метод вызывается/используется одновременно из разных потоков? Разделяет ли один поток, пока другой не будет завершен и т.д.?

Нет, они не делают; они будут просто выполнять метод на двух отдельных стеках одновременно. Если вы действительно хотите их заблокировать, используйте оператор lock, который вызывает второй поток, который входит в оператор блокировки, чтобы ждать, пока первый не вернется из оператора блокировки. Это может потребоваться, если ваш метод получает доступ (нелокальные) поля, которые являются общими данными.

В поточном приложении, когда нельзя использовать статический метод?

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

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

Ответ 3

Никакой метод в С# не использует локальные переменные.

Вы можете думать о статических функциях в VB.

Ответ 4

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