Не могу понять по какому принципу работает subj, в частности когда происходит непосредственный вызов метода
в интернете часто есть конструкция вида
InvokeOperation op = domainConextInstance.Invoke(...)
op.Completed +={...};
Первая мысль — это не правильно, т.к. мы можем "не успеть" подписаться на событие, но поставив эксперимент
InvokeOperation op = domainConextInstance.Invoke(...)
Thread.Sleep(5000);
op.Completed +={...};
я обнаружил, что все работает правильно и вызов на сервере происходит после выполнения всего этого кода.
Объясните пожалуйста в чем магия и чего я не учел
Спасибо
Здравствуйте, vladpol, Вы писали:
V>Не могу понять по какому принципу работает subj, в частности когда происходит непосредственный вызов метода
V>в интернете часто есть конструкция вида
V>V> InvokeOperation op = domainConextInstance.Invoke(...)
V> op.Completed +={...};
V>
V>Первая мысль — это не правильно, т.к. мы можем "не успеть" подписаться на событие, но поставив эксперимент
V>V> InvokeOperation op = domainConextInstance.Invoke(...)
V> Thread.Sleep(5000);
V> op.Completed +={...};
V>
V>я обнаружил, что все работает правильно и вызов на сервере происходит после выполнения всего этого кода.
V>Объясните пожалуйста в чем магия и чего я не учел
V>Спасибо
Достаточно сделать так.
class InvokeOperation
{
private bool _ready; // некое поле, выставляемое в true, когда операция завершена
private object _syncRoot = new object();
private EventHandler _completed;
public event EventHandler Completed
{
add
{
lock(_syncRoot)
{
if(_completed == null)
{
_completed = value;
if(_ready)
_completed(this, EventArgs.Empty);
}
else
_completed += value;
}
}
}
}
И мы уже не потеряем результат при несвоевременной подписке.
Здравствуйте, Аноним, Вы писали:
А>Достаточно сделать так.
А>class InvokeOperation
А>{
А>private bool _ready; // некое поле, выставляемое в true, когда операция завершена
А>private object _syncRoot = new object();
А>private EventHandler _completed;
А>public event EventHandler Completed
А>{
А>add
А>{
А>lock(_syncRoot)
А>{
А>if(_completed == null)
А>{
А>_completed = value;
А>if(_ready)
А>_completed(this, EventArgs.Empty);
А>}
А>else
А>_completed += value;
А>}
А>}
А>}
А>}
А>
А>И мы уже не потеряем результат при несвоевременной подписке.
я об этом думал, НО. если мы сделаем так
InvokeOperation op = domainConextInstance.Invoke(...)
Thread.Sleep(5000);
// подписки нет!!!
То вызов на сервере все равно происходит с задержкой.