void ProcessNewMails()
        {
            try
            {
                _outlookManager = new Outlook.OutlookManager();
                _outlookManager.SetFoldersToMonitor(ConfigurationManager.AppSettings["MAPIFolders"].Split(
                                                    new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

                Observable.FromEventPattern<Outlook.NewMailReceivedEventArgs>(_outlookManager, "MailReceived", Scheduler.ThreadPool).
                Throttle(TimeSpan.FromSeconds(.7)).ObserveOn(Scheduler.ThreadPool).Subscribe(evt =>
                {
                    var message = new Common.Models.Message();
                    message.From = evt.EventArgs.FromUser;
                    message.FromEmail = evt.EventArgs.FromEmail;
                    message.Content = evt.EventArgs.Body;
                    message.Subject = evt.EventArgs.Subject;
                    message.When = DateTime.UtcNow;
                    message.IsNew = true;
                    message.UserKey = LoggedUser.Key;
                    //this hint was applied for linking application and its sent messages
                    if (ServerApp != null && !string.IsNullOrEmpty(ServerApp.AppId))
                        message.AppKey = ServerApp.Key;

                    if (GroupToSend != null)
                        message.GroupKey = GroupToSend.Key;

                    GalaSoft.MvvmLight.Threading.DispatcherHelper.InvokeAsync(() => NewMails.Add(message));

                    var result = HttpClientHelper.PostSimple<string, Common.Models.Message>(ConfigurationManager.AppSettings["baseUrl"],
                                                                                "/api/messanger/postmessage/", message);
                    if (!string.IsNullOrEmpty(result))
                    {
                        int key;
                        int.TryParse(result, out key);
                        Infrastructure.LinkManager.Instance.Add(evt.EventArgs.EntryID, key);
                        Infrastructure.LinkManager.Instance.SaveToFile(App.AppMsgsLinkPath);
                    }
                },
                ex => ViewModelLocator.Logger.Error("Error in mail pull workflow", ex)
                , _cts.Token);

            }
            catch (Exception)
            {
                if (_outlookManager != null)
                {
                    _outlookManager.Dispose();
                    _outlookManager = null;
                }
            }
        }
        public void Dispose()
        {
            if (_disposed)
                return;
            _disposed = true;

            if (_userLoadedEvent != null)
            {
                _userLoadedEvent.Dispose();
                _userLoadedEvent = null;
            }

            if (_cts != null)
            {
                if (!_cts.IsCancellationRequested)
                    _cts.Cancel();
                _cts.Dispose();
            }

            if (_outlookInitTask != null && _outlookInitTask.Status != TaskStatus.Created)
            {
                _outlookInitTask.Dispose();
                _outlookInitTask = null;
            }

            if (_afterloginTask != null && _afterloginTask.Status != TaskStatus.Created)
            {
                _afterloginTask.Dispose();
                _afterloginTask = null;
            }

            if (_responseReceiver != null && _responseReceiver.Status != TaskStatus.Created)
            {

                try
                {
                    if (_responseReceiver.Status == TaskStatus.Running)
                        _responseReceiver.Wait(540);
                }
                catch { }

                if (_responseReceiver.Status != TaskStatus.Running)
                {
                    _responseReceiver.Dispose();
                    _responseReceiver = null;
                }
            }

            if (_outlookManager != null)
            {
                _outlookManager.Dispose();
                _outlookManager = null;
            }

            DisposeTrayIcon();

            GC.SuppressFinalize(this);
            GC.Collect();
        }