Я не знаю, как выполняется CLR при запуске программы. Я не совсем понимаю, когда использовать lock() или некоторые другие типы потокобезопасных объектов.Понимание процесса многопоточности и выполнения
Пожалуйста, помогите мне понять следующее:
Имея этот код:
public class Person {
string Name {get;set;}
}
public class Calc {
public string DoStuff(Person p){
// perform some processing on person object
// maybe call external API and update person object
}
}
Пожалуйста, поправьте меня, если я ошибаюсь, но это мое понимание примера 1. В однотридовой приложение (предположим, что это приложение mvc, и я использую DI и уже зарегистрировал «Сервис» в контейнере.
Я вызываю Service.Work() откуда-то в моем приложении, создается новый Calc() (CLR выделяет этот объект в памяти) и Calc.DoStuff() выполняет вычисление на Person obj ЭСТ. Так как до вызова нового Calc() создается и вызывается из двух браузеров, они находятся в отдельных путях выполнения. Это верно?
// Example 1
public class Service {
public void Work(person) {
var calc = new Calc();
string test = calc.DoStuff(person);
}
}
// Example 2
public class Service {
public Service() {
var calc = new Calc(); // this is different
}
public void Work(person) {
string test = calc.DoStuff(person);
}
}
Теперь то, что происходит в том же сценарии, однако на этот раз в момент выделения службы в памяти Calc конкретизируется в конструкторе Сервиса. Будут ли, что причина проблемы с до одновременных вызовов для работы() (так как существует только один экземпляр Calc? Объект.
- Что происходит тогда? Имя будет строка заполняться с «последними» строками?).
- Заблокирован ли он здесь, чтобы сначала он должен был выполнить запрос на первый вызов, а затем второй?
- Что происходит, когда два браузера называют Work (Person), отправляя два экземпляра Person этому методу. Предположим, что объекты Person «внутри» класса Calc, а затем вызывается внешний API - и кивает бит. Затем второй запрос вызывается Calc (Person), если бы этот объект Person обновлялся независимо (хотя существует только один экземпляр Calc()?). Или первый запрос (тот, который заглох) будет отменен вторым и забыт?
«Итак, если два браузера выполняют Calc.DoStuff() ...» - Вы упомянули браузеры. Это приложение ASP.NET? – mbeckish
Да и нет - поскольку это могут быть браузеры, но может случиться так, что два разных компонента приложения вызовут Service.Work() одновременно. Это имеет значение? если это Asp.net или нет? – BobSwanson