C# 在引发异步方法方面,它比使用单个事件处理程序的事件更好

C# 在引发异步方法方面,它比使用单个事件处理程序的事件更好,c#,multithreading,C#,Multithreading,在调用线程池上的一个方法并仍然获取异常(如果有)时,我正在使用单个事件处理程序的事件,并使用BeginInvoke()调用事件处理程序 A类订阅B类的事件。B类对A类一无所知 我忍不住觉得这是一种愚蠢的黑客方式,因此如何正确地执行它?切换到使用而不是线程池,它有很好的支持 我如何将对类A中方法的“引用”注入到类B中,而不给类B对类A的引用 您需要更新类B,以将函数作为构造函数参数或属性(例如 public class A { public void MethodToCall(string

在调用线程池上的一个方法并仍然获取异常(如果有)时,我正在使用单个事件处理程序的事件,并使用
BeginInvoke()
调用事件处理程序

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

我忍不住觉得这是一种愚蠢的黑客方式,因此如何正确地执行它?

切换到使用而不是
线程池,它有很好的支持

我如何将对类A中方法的“引用”注入到类B中,而不给类B对类A的引用

您需要更新类
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
公共A类
{
公共void方法调用(字符串参数)
{
Console.WriteLine(“我是A类-”+args);
}
}
公共B级
{
公共B(行动)
{
方法=行动;
}
公共操作方法调用{get;private set;}
}
...
var a=新的a();
var b=新的b(a.MethodToCall);
a、 方法调用(“a”);//我是甲级
b、 方法调用(“b”);//我是A-B班

不要认为这有助于解决问题的“订阅”部分。@Ben你重新发明了轮子-TPL就是为这种情况而构建的。它具有异常处理支持,因此不需要自定义事件等。我想我要问的是,如何注入“引用”将类A中的方法转换为类B,而不给类B一个类A引用。目前我订阅类B中的事件。例如,我知道方法大纲总是
MethodToCall(string arg)
,但我不想给类B一个类A引用,只想给类B一个
ClassA.MethodToCall的引用(string args)
@Ben似乎与您最初的问题完全不同……我已经用一个示例更新了我的问题,说明了如何做您想要的事情。谢谢!…
操作
是LINQ,不是吗?您知道这是如何在LINQ.NET之前的版本中编写的,纯粹出于兴趣。