在我的silverlight應用程序中,我將方法GetListCallBack
傳遞給Repository類中的另一個方法GetEmployees
的委託參數,該參數將該委託作爲事件處理程序附加到異步服務調用的完成事件。事件處理程序未取消訂閱
EmpViewModel類:
public class EmpViewModel
{
private IRepository EMPRepository = null;
//constructor
public EmpViewModel
{
this.EMPRepository= new Repository();
}
public void GetList()
{
this.EMPRepository.GetEmployees(xyz, this.GetListCallBack);
}
public void GetAnotherList()
{
this.EMPRepository.GetEmployees(pqr, this.GetAnotherListCallBack);
}
private void GetListCallBack(object sender, GetListCompletedEventArgs args)
{
if (args.Error == null)
{
this.collection1.Clear();
this.collection1 = args.Result;
}
else
{
//do sth
}
}
public void GetAnotherListCallback(object sender, GetListCompletedEventArgs args)
{
//do sth with collection1
}
}
倉儲類:
public class Repository : IRepository
{
private readonly ServiceClient _client=null ;
public Repository()
{
_client = new ServiceClient(Binding, Endpoint);
}
public void GetEmployees(int xyz, EventHandler<GetListCompletedEventArgs> eventHandler)
{
_client.GetListCompleted -= eventHandler;
_client.GetListCompleted += new EventHandler<GetListCompletedEventArgs>(eventHandler);
_client.GetListAsync(xyz);
}
}
現在,當GetList()
已經完成,然後,如果我調用另一個方法GetAnotherList()
在同一類EmpViewModel
,則該方法的調用在調用GetAnotherListCallBack
之前,再次調用方法GetListCallBack
。
這可能是因爲這兩種方法都訂閱了該事件。
正如你所看到的,我已經明確地從回調事件中取消訂閱事件處理器,但仍然調用事件處理器。 任何人都可以請建議我可能會出錯的地方嗎?
編輯:
當我使用的,而不是使用this.EMPRepository
調用Repository
方法效果很好既是回調方法傳遞給Repository
類的不同實例,只有attched回調方法被炒魷魚
public class EmpViewModel
{
public void GetList()
{
EMPRepository = new Repository();
EMPRepository.GetEmployees(xyz, this.GetListCallBack);
}
public void GetAnotherList()
{
EMPRepository = new Repository();
EMPRepository.GetEmployees(pqr, this.GetAnotherListCallBack);
}
--------
您可以更改「ServiceClient」類的代碼嗎?它應該是固定的東西。 – 2013-04-10 06:57:21
@ MD.Unicorn ServiceClient類是在添加服務引用時由VS自動生成的。 – Raj 2013-05-07 12:59:47