gpt4 book ai didi

c# 需要在 LOCK 范围内引发事件

转载 作者:行者123 更新时间:2023-11-30 18:43:35 24 4
gpt4 key购买 nike

我有一个文件处理程序类,它使用锁将 xdoument 移动到缓存。 伪代码:

public FetchDocument() {
var xdoc = Cache[_Key1];
if (xdoc == null) {
lock(_lockobject) {
// in case prev.thread has done upload will currth read waiting
xdoc = Cache[_Key1];

if (xdoc == null) {
.... Code to grab from file and add to catch - works great.....
}
}
}
xdoc = Cache[_Key1];

}

现在我想公开在文件加载之后但在缓存之前触发的事件,并且在事件上有一个中止标志。

问题是我如何只触发当前(未锁定)线程的事件?

另一个线程可能被锁定等待这个线程清除锁定代码

谢谢

马丁

最佳答案

如果我理解正确,您希望允许调用者中止缓存文档。您可以通过将 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对象。即使这些未锁定的操作是读取操作,集合也可能在锁内发生变化,因此您可能会得到不可预知的结果。所有对缓存的操作都应该在锁中完成。

关于c# 需要在 LOCK 范围内引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4245773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com