【问题标题】:Something better than event with single event handler for raising async method使用单个事件处理程序引发异步方法的事件比事件更好
【发布时间】:2013-01-10 20:09:36
【问题描述】:

目前调用线程池上的方法并且如果有任何异常仍然会得到异常我正在使用带有单个事件处理程序的事件并使用BeginInvoke()调用事件处理程序。

A 类从 B 类订阅事件。B 类对 A 类一无所知。

我不禁觉得这是一种愚蠢的 hacky 方式,那么你如何正确地做到这一点?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    切换到使用Task Parallel Library 而不是ThreadPool,它有很好的exception handling 支持。

    如何在不向 B 类提供对 A 类的引用的情况下将 A 类中的方法的“引用”注入 B 类

    您需要更新类 B 以将函数作为构造函数参数或属性例如

    public class A
    {
        public void MethodToCall(string args)
        {
            Console.WriteLine("I am class A - " + args);
        }
    }
    
    public class B
    {
        public B(Action<string> action)
        {
            Method = action;
        }
    
        public Action<string> MethodToCall { get; private set; }
    }
    ...
    var a = new A();
    var b = new B(a.MethodToCall);
    a.MethodToCall("A"); // I am class A - A
    b.MethodToCall("B"); // I am class A - B
    

    【讨论】:

    • 不要认为这有助于解决问题的“订阅”部分。
    • @Ben 你在重新发明轮子 - TPL 是为这些类型的情况而构建的。它具有异常处理支持,因此不需要自定义事件等。
    • 我想我要问的是,如何在不给 B 类 A 类引用的情况下将 A 类中的方法的“引用”注入 B 类。目前我正在订阅B 类中的事件。例如,我知道方法大纲始终是 MethodToCall(string arg),但我不想给 B 类引用 A 类,只引用 ClassA.MethodToCall(string args)
    • @Ben 似乎与您最初的问题完全不同......我已经更新了我的问题,并举例说明了如何做您想做的事情。
    • 谢谢!...Action 不是 LINQ 吗?你知道这完全是出于兴趣,在 LINQ 之前的 .NET 版本中是如何编写的。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多