Я думаю, что ваш код будет работать - закрытие переместится затем в кучу, даже если они были просто переменными стека (ManualReseetEvent наверняка не будет).
Но почему бы вам не поставить все послеevent.WaitOne () только внутри продолжения (блок был event.Set вызывается)?Я думаю, что это должен быть предпочтительный способ справиться с подобной ситуацией, и вы не столкнетесь с проблемами таким образом (вам вообще не нужен бар во внешнем блоке, и вы все равно можете использовать MRE для проверки).
Я бы подумал о том, чтобы превратить это в Операции с использованием объектов Задачи - это решило бы все это за один раз (например, вернуть Задачу из AsyncOperation).Затем вы можете дождаться результата задания и использовать возвращенный столбец ...
class Foo
{
// ...
private Task<Bar> AsyncOperation(Task<Bar> initializeBar)
{
return initializeBar
.ContinueWith(
bar => {
/* do your work with bar and return some new or same bar */
return bar;
});
}
}
и использовать его следующим образом:
var task = foo.AsyncOperation(Taks.Factory.StartNew(() => { /* create and return a bar */ }));
var theBar = task.Result; // <- this will wait for the task to finish
// use your bar
PS: закрытие в основном обернет ихпросто в объект класса;) PPS: мне трудно протестировать этот код без AsyncOperation, но он должен работать по модулю синтаксических ошибок при неправильной орфографии / наборе текста, которые я сделал