protected void OnOperationFinished(MessageEventArg e)
 {
     //##### Method1 - Event raised on the same thread ##### 
     //EventHandler<MessageEventArg> handler = OperationFinished;
     //if (handler != null)
     //{
     //    handler(this, e);
     //}
     //##### Method2 - Event raised on (the same) separate thread for all listener #####
     //EventHandler<MessageEventArg> handler = OperationFinished;
     //if (handler != null)
     //{
     //    Task.Factory.StartNew(() => handler(this, e));
     //}
     //##### Method3 - Event raised on different threads for each listener #####
     if (OperationFinished != null)
     {
         foreach (EventHandler<MessageEventArg> handler in OperationFinished.GetInvocationList())
         {
             Task.Factory.FromAsync((asyncCallback, @object) => handler.BeginInvoke(this, e, asyncCallback, @object), handler.EndInvoke, null);
         }
     }
 }