У меня есть вопрос относительно следующего сегмента кода, который я нашел на веб-странице Microsoft C# tutorial. В коде они предоставляют демонстрацию задач. В обработчике событий они создают задачу, которая обновляет незащищенную коллекцию.Является ли этот код фактически потокобезопасным?
Этот код безопасен? По-моему, это не так. Каков наилучший способ сделать этот код потокобезопасным?
private ArrayList students = new ArrayList();
private void btnCreateStudent_Click(object sender, RoutedEventArgs e)
{
Student newStudent = new Student();
newStudent.FirstName = txtFirstName.Text;
newStudent.LastName = txtLastName.Text;
newStudent.City = txtCity.Text;
ClearForm();
Task task1 = new Task(() => AddToCollection(newStudent));
task1.Start();
ClearForm();
}
private void AddToCollection(Student student)
{
Thread.Sleep(5000);
students.Add(student);
int count = students.Count;
MessageBox.Show("Student created successfully. Collection contains " + count.ToString() + " Student(s).");
}
Я не согласен со следующим утверждением
students.Add(student);
Я думаю, что она должна быть защищена замком.
Вы имеете в виду тему _safe_? –
на какой странице MSDN вы это сделали? Что конкретно вам интересно, это потокобезопасность? Добавить вызов? На самом деле я не уверен, что этот код будет работать правильно, поскольку вы вызываете MessageBox.Show в задаче. Они должны работать в потоке пользовательского интерфейса. – Default
нет, он отлично работает с MessageBox.Show я скомпилировал его и работает. Моя забота о студентах. Add (студент); –