我有一系列我想定期运行的任务......每隔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:我无法在调试模式下实现这一点......