Возможно, вы добавили делегата дважды, возможно ли это?
В этом случае проблема не в том, кто вызывает делегата, а в том, кто добавляет делегата к событию.
Возможно, высделал что-то вроде ...
private Class1 instance1;
void callback(...)
{
}
void myfunction()
{
this.instance1.DataCalled += this.callback;
this.instance1.DataCalled += this.callback;
}
Если нет, попробуйте добавить точку останова, в которой вы подписываетесь на событие, и посмотрите, вызывается ли она дважды.
В качестве примечания следуетвсегда проверяйте нулевое значение при вызове события, если нет подписчика, вы можете получить исключение NullReferenceException.Я бы также предложил вам использовать переменную для хранения делегата события, чтобы избежать риска сбоя многопоточности.
public void CallData()
{
List<DataItem> dataItems = new List<DataItem>();
var handler = this.DataCalled;
if (handler != null)
handler(this, dataItems);
}
Редактировать: поскольку теперь я вижу код, очевидно, что каждый раз, когда вы вызываете метод GetNewDataItemsВы подписываетесь каждый раз на событие.Делайте таким образом, что вы подписываетесь только один раз, например, в конструкторе, или сохраняете свою переменную где-нибудь, или отменяете событие по завершении.
Этот код также содержит вероятную утечку памяти: каждый раз, когда вы добавляете делегатаВы поддерживаете как экземпляр, который содержит событие, так и экземпляр, который содержит подписанный метод, по крайней мере, до тех пор, пока оба не станут ссылками.
Вы можете попробовать сделать что-то вроде этого ...
void dataHelper_DataCalled(object sender, List<DataItem> dataItemsList)
{
// Deregister the event...
(sender as Class1).DataCalled -= dataHelper_DataCalled;
//Do something with results
}
Таким образом, однако, вы должны убедиться, что если во время регистрации события не возникнет исключение, событие будет запущено или у вас снова будут утечки памяти.
Вместо события, возможно, вам нужен только делегат.Конечно, вы должны установить для поля делегата значение NULL, если вы хотите освободить делегата.
// in data helper class
private DataHelper.DataCalledEventHandler myFunctor;
public void CallData(DataHelper.DataCalledEventHandler functor)
{
this.myFunctor = functor;
//SOME CODE THAT RETURNS DATA
}
// when the call completes, asynchronously...
private void WhenTheCallCompletes()
{
var functor = this.myFunctor;
if (functor != null)
{
this.myFunctor = null;
List<DataItem> dataItems = new List<DataItem>();
functor(this, dataItems);
}
}
// in your function
... dataHelper.CallData(this.dataHelper_DataCalled); ...