Нужен совет по безопасности ниток - PullRequest
1 голос
/ 13 октября 2011

Безопасно ли писать код таким образом?

        var form = new Form();

        Action callback = 
            () =>
                {
                    // do something 1
                };

        ThreadPool.QueueUserWorkItem(
            args =>
                {
                    // do something 2
                    form.BeginInvoke(callback);
                });

UPD Меня беспокоит безопасность доступа к переменной "form". Я использую метод BeginInvoke из фонового потока; могу ли я быть уверен, что до этого момента не будет никакого переупорядочения чтения / записи? (потенциально может оставить переменную формы в несогласованном состоянии с точки зрения фонового потока)

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Да, выглядит нормально. Переменная form будет захвачена, и если она не null, когда задание в ThreadPool выполняется, она должна работать.

Но вы упустили много деталей, я предполагаю, что этот код все из 1 метода.

// do something 1 может получить доступ к GUI, // do something 2 не может.

1 голос
/ 13 октября 2011
ThreadPool.QueueUserWorkItem(
args =>
{
    // do something 2
    form.BeginInvoke(x);
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...