protected override void ExecuteCore() { ClientState.Current.Messages.Errors.Clear(); if (ChannelsManager.Channels.Count == 0) { return; } var channels = ListOrSingle <ChannelInstance> .Get(channel, ChannelsManager.Channels); var gate = new ConcurrencyGate(2); foreach (var channelInstance in channels.Where(c => !c.Configuration.IsConnected)) { var inputChannel = channelInstance.InputChannel; var config = channelInstance.Configuration; var foldersTask = new ReceiveFoldersTask(channelInstance.Configuration, inputChannel.Clone()); foldersTask.FinishedSuccess += ((sender, e) => ReceiveFoldersTask_FinishedSuccess((ReceiveFoldersTask)sender, config, inputChannel)); gate.Add(foldersTask); } // Wait for all receive tasks to complete, keeping the queue filled for the ReceiveTask. // This prevents any new receive task from getting enqueued. gate.Execute(); // Clean up connection scavangers ConnectionPoolScavenger.Shutdown(); GC.Collect(GC.MaxGeneration); }
protected override void ExecuteCore() { ClientState.Current.Messages.Errors.Clear(); if (ChannelsManager.Channels.Count == 0) { return; } var gate = new ConcurrencyGate(2); var channels = ListOrSingle <ChannelInstance> .Get(channel, ChannelsManager.Channels); foreach (var instance in channels.Where(c => !c.Configuration.IsConnected)) { if (instance.ContactsChannel != null) { gate.Add(new SyncContactsTask(instance.Configuration, instance.ContactsChannel.Clone()) { OverrideCanExecute = OverrideCanExecute }); } if (instance.StatusUpdatesChannel != null) { gate.Add(new SyncStatusUpdatesTask(instance.Configuration, instance.StatusUpdatesChannel.Clone()) { OverrideCanExecute = OverrideCanExecute }); } //if (instance.CalendarChannel != null) // new SyncCalendarTask(instance.Configuration, instance.CalendarChannel) { OverrideCanExecute = OverrideCanExecute }.ExecuteAsync(); } if (channel == null) { gate.Add(new SyncSearchStreamTask { OverrideCanExecute = OverrideCanExecute }); } gate.Execute(); EventBroker.Publish(AppEvents.SyncFinished); }