c# - 删除匿名事件处理程序

标签 c# wcf

我有以下代码,其中 SprintServiceClient 是对 WCF 服务的引用-

public class OnlineService
{
    private SprintServiceClient _client;
    public OnlineService()
    {
        _client = new SprintServiceClient();
    }

    public void AddMemberToTeam(MemberModel user, int projectId, Action<int> callback)
    {
        _client.AddMemberToTeamCompleted += (s, e) => callback(e.Result);
        _client.AddMemberToTeamAsync(user.ToUser(), projectId);
    }
}

问题是每次调用 AddMemberToTeam 时都会向 client.AddMemberToTeamCompleted 添加另一个回调

即第一次调用 AddMemberToTeam 时回调被调用一次,第二次调用 AddMemberToTeam 回调被调用两次等等。

一旦事件处理程序被调用或使用其他接受回调的方法,是否有任何方法可以从 AddMemberToTeamCompleted 中删除事件处理程序?

最佳答案

只要先将委托(delegate)分配给变量,就可以从内部引用匿名方法:

EventHandler<SomeEventArgs> handler = null;
handler = (s, e) =>
    {
        _client.AddMemberToTeamCompleted -= handler;
        callback(e.Result);
    };

_client.AddMemberToTeamCompleted += handler;

注意变量需要单独声明并赋值,否则在方法体内使用时编译器会认为它未初始化。

关于c# - 删除匿名事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303922/

相关文章:

xml - DataContractSerializer : preserve references

c# - NewGuid 与 System.Guid.NewGuid().ToString ("D");

c# - Crystal Reports中如何获取列的总和?

c# - FormClosing 事件被多次调用

c# - Type.GetType 无法从已加载的程序集创建类型

c# - 使用控制台应用程序客户端将输入列表填充到服务

jquery - 如何从 jquery/ajax 向 [OperationContract] webservice 方法传递参数?

wcf - 如何在启动时使用 WCF 和 IIS 连接到 ActiveMQ

c# - LINQ - 删除表达式树的部分内容

c# - JavaToWs 共享类型