相关疑难解决方法(0)

.NET的线程安全缓存库

背景:

我维护了几个可以或已经从缓存中受益的Winforms应用程序和类库.我也知道缓存应用程序块和System.Web.Caching命名空间(根据我的收集,在ASP.NET之外使用它是完全可以的).

我发现,尽管上述两个类在技术上都是"线程安全的",因为单个方法是同步的,但它们似乎并没有真正适用于多线程方案.具体来说,它们没有实现类似于.NET 4.0中新类的GetOrAdd方法ConcurrentDictionary.

我认为这种方法是缓存/查找功能的原始方法,显然框架设计者也意识到了这一点 - 这就是为什么方法存在于并发集合中的原因.但是,除了我还没有在生产应用程序中使用.NET 4.0这一事实,字典不是一个完整的缓存 - 它没有像过期,持久/分布式存储等功能.


为什么这很重要:

"富客户端"应用程序(甚至是某些Web应用程序)中的一个相当典型的设计是在应用程序启动时立即开始预加载缓存,阻止客户端请求尚未加载的数据(随后将其缓存以备将来使用)使用).如果用户正在快速浏览他的工作流程,或者网络连接速度很慢,那么客户端与预加载器竞争并不常见,并且两次请求相同的数据真的没有多大意义. ,特别是如果请求相对昂贵.

所以我似乎留下了一些同样糟糕的选择:

  • 不要试图使操作成为原子,并冒着两次加载数据的风险(并且可能有两个不同的线程在不同的副本上运行);

  • 序列化对缓存的访问,这意味着锁定整个缓存只是为了加载单个项目 ;

  • 开始重新发明轮子只是为了获得一些额外的方法.


澄清:示例时间表

假设当应用程序启动时,它需要加载3个数据集,每个数据集需要10秒才能加载.请考虑以下两个时间表:

00:00 - Start loading Dataset 1
00:10 - Start loading Dataset 2
00:19 - User asks for Dataset 2

在上面的例子中,如果我们不使用任何类型的同步,用户必须等待整整10秒才能获得1秒内可用的数据,因为代码将看到该项目尚未加载到缓存中并尝试重新加载它.

00:00 - Start loading Dataset 1
00:10 - Start loading Dataset 2
00:11 - User asks for Dataset 1

在这种情况下,用户要求已经在缓存中的数据.但是如果我们序列化对缓存的访问,他将不得不等待另外9秒,因为缓存管理器(无论是什么)都不知道要求的特定项目,只有那个"东西"是被要求和"某事"正在进行中.


问题: …

.net multithreading caching atomic

31
推荐指数
1
解决办法
6363
查看次数

使用标准.NET Framework的AOP like属性的基本实现

可能重复:
通过属性的C#wrap方法

我想实现这样的功能:

[Atomic]
public void Foo()
{           
    /* foo logic */
}
Run Code Online (Sandbox Code Playgroud)

其中[Atomic]attribute是一个属性,它在事务范围内包装函数逻辑:

using(var scope = new TransactionScope())
{
    /* foo logic */
    scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

怎么写这样的属性?

我之前问过基本相同的问题,我知道这可以用AOP完成,但我没有提到我正在寻找一些最简单的概念证明实现或有用的文章,可以帮助我用纯.NET编写这个框架(我想使用RealProxy和MarshalByRefObject类型,我已阅读浏览相关问题).

我需要完全解决这个显示的例子.这似乎是一个基本的东西,所以我想从头开始学习如何做到这一点.它现在不需要安全和灵活.

.net c# aop attributes

18
推荐指数
2
解决办法
1万
查看次数

如何在类上实现自定义LogAttribute

我想实现自定义LogAttribute,它将在类中的每个方法的开头和结尾记录信息,也应该记录错误.我想将该属性应用于Class.

我见过PostSharp.但我想拥有自己的自定义日志属性,而不是使用PostSharp或类似的库.

性能是主要关键,LogAttribute不应影响性能.

我已阅读有关IMessageSync的信息,但它会影响性能.

在MVC中,我们得到CustomFilters,其中我们可以使用LogActionHandler,它将在每个Action方法的开头和结尾执行.我想在ASP.Net web Form中实现类似的功能.

任何人都可以提供一些示例代码来帮助我.

c# logging aop

5
推荐指数
1
解决办法
1980
查看次数

如何检查方法是否具有Castle Interceptor的属性?

我正在学习Castle Windsor和WCF的依赖注入和拦截,我想检查一个截获的方法是否有自定义属性(LogAttribute).

(我的例子基于这个答案:https://stackoverflow.com/a/2593091)

服务合约 :

[ServiceContract]
public interface IOrderService
{
    [OperationContract]
    Order GetOrder(int orderId);
}

[DataContract]
public class Order
{
    [DataMember]
    public string Id { get; set; }

    // [...]
}
Run Code Online (Sandbox Code Playgroud)

服务实施:

public class OrderService : IOrderService
{
    private readonly IDatabase _database;

    public OrderService(IDatabase database)
    {
        _database = database;
    }

    [Log] // <- my custom attribute
    public Order GetOrder(int orderId)
    {
        return _database.GetOrder(orderId);
    }
}

public class LogAttribute : Attribute
{ }
Run Code Online (Sandbox Code Playgroud)

简单的数据访问层:

public interface IDatabase …
Run Code Online (Sandbox Code Playgroud)

c# wcf dependency-injection castle-windsor castle-dynamicproxy

1
推荐指数
1
解决办法
1376
查看次数