小编MBo*_*ros的帖子

WeakEventManager保存对订户的引用

我一直在使用WeakEventManager来避免内存泄漏,我开始过度使用它们.我为INotifyPropertyChanged创建了扩展方法,例如:


public static void AddWeakPropertyChanged(this INotifyPropertyChanged item, Action handler)
{
    PropertyChangedEventManager.AddHandler(item, (s, e) => handler(e.PropertyName), string.Empty);
}
Run Code Online (Sandbox Code Playgroud)

现在我很快意识到,这不起作用.实际上,您无法真正使用匿名方法进行弱事件处理.(如果我理解正确,那么编译器为它创建一个'闭包类'(用于保存引用的值),它具有处理程序,但由于你的闭包类没有在任何地方被引用,因此GC将清除它,并且事件处理程序不会被叫)

问题1:这是正确的吗?我的意思是它是正确的,然后当使用匿名方法(或lambda)作为弱事件处理程序时,仅当GC没有同时运行时才调用处理程序(例如,它是不确定的)?

嗯,我非常感谢,所以我做了一些单元测试,以确保我做对了.在我进行以下单元测试之前,它似乎还可以:


        class DidRun
        {
            public bool Value { get; set; }
        }
        class TestEventPublisher
        {
            public event EventHandler<EventArgs> MyEvent;
            public void RaiseMyEvent()
            {
                if (MyEvent != null)
                    MyEvent(this, EventArgs.Empty);

            }
        }
        class TestClosure
        {
            public DidRun didRun { get; set; }
            public EventHandler<EventArgs> Handler { get; private set; }
            public TestClosure()
            {
                this.Handler = new EventHandler<EventArgs>((s, e) => didRun.Value = true); …
Run Code Online (Sandbox Code Playgroud)

c# closures weakeventmanager

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

工厂类使用泛型但没有基类

我得到了我认为可能是一个不寻常的问题(我已经搜索了很多答案,但我不认为我找到了一个).

我有从队列中读取的消息,并且根据消息类型包含需要反序列化为具体c#类的有效负载.这需要最终具体(我不能使用泛型)因为我使用表达式树对从队列到达的类执行评估.

基类如下所示:

public abstract class BaseRuleMessage<T>  
{
    public abstract Func<T, bool> CompileRule(Rule r, T msg);

    public T Deserialize(ClientEventQueueMessage message)
    {
        return JsonConvert.DeserializeObject<T>(message.Payload);
    }        

    public BaseRuleMessage()
    {
        RulesCompleted = new List<int>();
    }

    public IEnumerable<Rule> FilterRules(RuleGroup ruleGroup)
    {
        return ruleGroup.Rules.Where(item =>
            !RulesCompleted.Any(r => r.Equals(item.Id)));
    }
Run Code Online (Sandbox Code Playgroud)

我像这样实现基类:

 public class UiTransactionUpdate : BaseRuleMessage<UiTransactionUpdate>
{

    public override Func<UiTransactionUpdate, bool> CompileRule(Rule r, UiTransactionUpdate msg)
    {
        var expression = Expression.Parameter(typeof(UiTransactionUpdate));
        Expression expr = BuildExpr(r, expression, msg);
        return Expression.Lambda<Func<UiTransactionUpdate, bool>>(expr, expression).Compile();
    }
    public Guid TransactionId { get; …
Run Code Online (Sandbox Code Playgroud)

c# abstract-class factory-pattern

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