任务多次启动?

时间:2016-05-25 16:39:25

标签: c# multithreading visual-studio-2013 task-parallel-library

我有一系列我想定期运行的任务......每隔x秒或几分钟。

当达到间隔时,我正在使用调度程序来触发。一旦到达并且计时器滴答作响,我有一系列要运行的任务,我一个接一个地等待。

以下是代码的一部分...为简单起见:

private async void timerAutoSync_Tick(object sender, EventArgs e)
    {
        List<Task> tasks = new List<Task>();
        //Task[] tasks = new Task[2];


        try
        {
            MainMessage("AutoSync | Looking for items to sync... ");

            timerAutoSync.IsEnabled = false;

            Sync.FeedbackEvent += sync_FeedbackEvent;


            // Run enabled tasks...
            if (!autosyncStopRequested && Properties.Settings.Default.AutoSyncOptionSyncCustomers)
            {
                // New 
                SyncProcessRunning(true, "Customers");

                Task<bool> tCustomerSync = Sync.SyncCustomersToWebMaster("", Properties.Settings.Default.msSQLConnectionString.ToString(), WPFCommon.This_Sync_Node_ID);
                tasks.Add(tCustomerSync);
                bool tCustomerSyncResult = tCustomerSync;
                MainMessage("After Customer Sync await | Autosync Timer Status: " + timerAutoSync.IsEnabled.ToString());
            }

    // Other tasks for products, inventory, etc. follow the same pattern 

            await Task.WhenAll(tasks).ContinueWith((t) =>
                {
                    Application.Current.Dispatcher.Invoke((Action)delegate
                    {
                        string memoryBefore = String.Format("Memory used before collection: {0:N0}", GC.GetTotalMemory(false));
                        MainMessage(memoryBefore);
                        IcsLogEntries.WriteXmlLogEntry(memoryBefore);
                        Task.Delay(5000);

                        // Try to keep things clean.. 
                        GC.Collect();

                        string memoryAfter = String.Format("Memory used After collection: {0:N0}", GC.GetTotalMemory(true));
                        MainMessage(memoryAfter);
                        IcsLogEntries.WriteXmlLogEntry(memoryAfter);
                        Task.Delay(5000);

                        timerAutoSync.IsEnabled = true;

                        MainMessage("AutoSync | Sync Complete. " + DateTime.Now.ToString());

                        SyncProcessRunning(false, "");

                    });
                });

所以这很好运行,等待它应该,点击WhenAll让我清理并重新打开定时器,等待x段时间(现在30秒)然后再次运行相同系列的任务。

然而在生产中它似乎开始我的每个任务运行良好...把它留在某处,然后在调度计时器的下一轮传递中运行2个相同的任务...下一轮计时器它运行3个相同的任务...等。在计时器的每个刻度处添加相同任务的倍数......

我知道这是因为我在Sync。*任务中创建的日志文件...我可以看到一行中只有一个应该是多个。

我想知道我是否应该处理WhenAll.ContinueWith部分中的任务......

从我的日志中,调度计时器tick似乎没有运行多个实例。只是Sync。*任务。

我很困惑。

我将在我的WhenAll.Continue secton中添加此内容:

                        foreach (Task t in tasks)
                        {
                            t.Dispose();
                        }

其他建议?

BTW:我无法在调试模式下实现这一点......

0 个答案:

没有答案