безопасно ли поделиться локальной переменной между потоками (через закрытие обратного вызова)?

Я хочу сделать что-то вроде следующего - в основном я называю async операцию, которая позвонит обратный вызов в другом потоке, и я хочу подождать, пока он завершил «встроенный». Мое волнение состоит в том, что изменения переменных, общих через потоки (BAR & Event), не могут быть синхронизированы из-за хранения в регистрах. Если бы они были переменными-членами, я мог бы отметить их волатильным, но волатильный нельзя использовать на местных переменных, созданных на стеке. Я мог бы использовать переменные элемента, но я думаю, что его уборщик не загромождает мой класс, сохраняя его все местное.

Bar bar = null;
ManualResetEvent event = new ManualResetEvent(false);

foo.AsyncOperation(new Action(()=>{    
    // This delegate will be called in another thread
    bar = ...
    event.Set();
}));

event.WaitOne(timeout);
// use bar
12
задан Shane 3 September 2011 в 01:05
поделиться