Если я правильно понимаю, вы хотите разрешить вызывающей стороне прервать кэширование документа.Это можно сделать, передав Func в метод FetchDocument, например:
public XDocument FetchDocument(FUnc<XDocument, bool> cacheNewDocument) {
var xdoc;
lock(_lockobject) {
// in case prev.thread has done upload will currth read waiting
xdoc = Cache[_Key1];
if (xdoc == null) {
xdoc = .... Code to grab from file and add to catch - works great.....
if (cacheNewDocument(xdoc)){
Cache.Add(_Key1, xdoc)
}
else{
return xdoc;
}
}
}
return xdoc;
}
Таким образом, ваш код может вызвать Func с соответствующими данными перед добавлением документа в кэш, и вызывающая сторона может вернуть true \значение false, чтобы получить семантику прерывания.
Это гораздо проще, чем использование события, и обеспечивает применение правила «как только запускать событие (я) только для семантики текущего (разблокированного) потока».
С другой стороны, хотя ваш исходный код является псевдокодом, вы получаете доступ к объекту Cache вне блокировки.Даже если эти разблокированные операции являются операциями чтения, коллекция может быть видоизменена внутри блокировки, и вы можете получить непредсказуемые результаты.Все операции с кешем должны выполняться в замке.