Я не знаю, но у Вас есть обычные счетчики производительности в Windows Mobile? Вы могли посмотреть на вещи как переключатели/секунда контекста. Я не знаю, существует ли тот, который конкретно измеряет время контекстного переключения все же.
Общий шаблон здесь состоит не в том, чтобы возвращать какие-либо данные из обработчика события, а в добавлении свойств к вашему объекту аргумента события, чтобы потребитель события мог установить свойства, которые затем может вызывать вызывающий. доступ. Это очень часто встречается в коде обработки пользовательского интерфейса; вы повсюду видите концепцию события Cancel.
Ниже приведен псевдокод, не готовый к компиляции. Его цель - показать шаблон.
public class MyEventArgs : EventArgs
{
public bool Cancel{get;set;}
}
public bool fireEvent()
{
MyEventArgs e=new MyEventArgs();
//Don't forget a null check, assume this is an event
FireEventHandler(this,e);
return e.Cancel;
}
public HandleFireEvent(object sender, MyEventArgs e)
{
e.Cancel=true;
}
Edit
Мне нравится, как Джон Скит сформулировал это: сделать EventArgs
изменяемым. То есть получатель события может изменить состояние объекта EventArgs
, позволяя инициатору события получить доступ к этим данным.
Единственный способ сделать это - сделать один из аргументов (желательно "args", а не отправителя) изменяемым. Если он еще не изменен, у вас в основном проблемы - просто нет способа получить информацию.
(Хорошо, есть один способ - вы можете сохранить неизменным сам аргумент события, но сделать один из его членов методом что в конечном итоге вызывает делегат, зарегистрированный кодом, в первую очередь вызывающим событие. Но это ужасно ...)
Простым решением является использование закрытия:
public override bool Run() {
SomeInfo someInfo = ...
table.WhenData += (obj, args) => {
someInfo.Return = something
};
}