Я пытаюсь реализовать следующие функции:
class WeightResolver {
WeightMonitor _source;
bool _cancelled;
Weight _threshold;
public Cancel() {
_cancelled = true;
}
public Weight Resolve(){
_cancelled = false;
while(_source.CurrentWeight < threshold ) {
if(_cancelled)
throw new CancelledOperationException();
// Wait until one of the above conditions is met
}
return _source.CurrentWeight
}
}
Однако я сталкиваюсь с проблемами при управлении своими потоками. Например, метод Cancel регистрируется через событие, а Resolve вызывается следующим образом:
_activity_timeout_manager.TimeoutHandler += new Action(_weight_resolver.Cancel())l
try {
var weight = _weight_resolver.Resolve();
}
catch(CancelledOperationException) { .... }
, где менеджер активности запускает таймер, для которого он вызывает события, используя TimeoutHandler.Invoke ();
Проблема в том, что, хотя оно правильно зарегистрировано в событии, метод Cancel () никогда не вызывается. Я полагаю, что это потому, что поток, к которому он обращается, в данный момент вращается, и поэтому у него никогда не будет шанса на процессоре.
Что я могу сделать, чтобы исправить ситуацию, не делая асинхронный вызов Resolve ()? Для WeightResolver.Resolve () крайне предпочтительно оставаться синхронным, потому что вызывающий его код должен вращаться, если в любом случае не будет предоставлен какой-либо возврат.
РЕДАКТИРОВАТЬ: Чтобы уточнить, что я прошу. Это похоже на довольно распространенную установку, и я был бы удивлен, если бы не было простого стандартного способа справиться с этим. Я просто никогда не сталкивался с ситуацией раньше и не знаю, что именно это может быть.