我有以下代码,其中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时,都会向客户端添加另一个回调。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/

10-12 12:50
查看更多