DomainContext InvokeOperation
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 24.01.11 17:19
Оценка:
Не могу понять по какому принципу работает subj, в частности когда происходит непосредственный вызов метода

в интернете часто есть конструкция вида

 InvokeOperation op = domainConextInstance.Invoke(...)
 op.Completed +={...};


Первая мысль — это не правильно, т.к. мы можем "не успеть" подписаться на событие, но поставив эксперимент


 InvokeOperation op = domainConextInstance.Invoke(...)
  Thread.Sleep(5000);
 op.Completed +={...};


я обнаружил, что все работает правильно и вызов на сервере происходит после выполнения всего этого кода.

Объясните пожалуйста в чем магия и чего я не учел

Спасибо
С уважением, Владислав Полищук
Re: DomainContext InvokeOperation
От: Аноним  
Дата: 27.01.11 12:14
Оценка:
Здравствуйте, 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;
}
}
}
}

И мы уже не потеряем результат при несвоевременной подписке.
Re[2]: DomainContext InvokeOperation
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 27.01.11 14:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Достаточно сделать так.


А>
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);
// подписки нет!!!


То вызов на сервере все равно происходит с задержкой.
С уважением, Владислав Полищук
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.