我有以下代码,其中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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,每次调用AddMemberToTeam时,它都会向client.AddMemberToTeamCompleted添加另一个回调.
即第一次调用AddMemberToTeam时,调用一次回调,第二次调用AddMemberToTeam,调用两次ect回调.
有没有办法在调用eventhandler后从AddMemberToTeamCompleted中删除eventhandler或使用另一个接受回调的方法?
Tim*_*son 53
只要先将委托分配给变量,就可以从内部引用匿名方法:
EventHandler<SomeEventArgs> handler = null;
handler = (s, e) =>
{
_client.AddMemberToTeamCompleted -= handler;
callback(e.Result);
};
_client.AddMemberToTeamCompleted += handler;
Run Code Online (Sandbox Code Playgroud)
请注意,您需要声明变量并单独指定它,否则当您在方法体内使用它时,编译器会认为它未初始化.
Mar*_*ell 18
制作自我取消订阅事件处理程序的技巧是捕获处理程序本身,以便您可以在其中使用它-=.但是,存在着声明和明确指配的问题; 所以我们做不到这样的事情:
EventHandler handler = (s, e) => {
callback(e.Result);
_client.AddMemberToTeamCompleted -= handler; // <===== not yet defined
};
Run Code Online (Sandbox Code Playgroud)
因此我们初始化为nullfirst,因此声明在使用之前,并且null在首次使用之前它具有已知值():
EventHandler handler = null;
handler = (s, e) => {
callback(e.Result);
_client.AddMemberToTeamCompleted -= handler;
};
_client.AddMemberToTeamCompleted += handler;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6956 次 |
| 最近记录: |