private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightTask>> e) { lock (jobResultReceivedLocker) { foreach (LightweightTask lightweightTask in e.Value) { HiveTask hiveTask = GetHiveTaskById(lightweightTask.Id); if (hiveTask != null) { // lastJobDataUpdate equals DateTime.MinValue right after it was uploaded. When the first results are polled, this value is updated if (hiveTask.Task.State == TaskState.Offline && lightweightTask.State == TaskState.Waiting) { hiveTask.Task.LastTaskDataUpdate = lightweightTask.LastTaskDataUpdate; } hiveTask.UpdateFromLightweightJob(lightweightTask); if (!hiveTask.IsFinishedTaskDownloaded && !hiveTask.IsDownloading && hiveTask.Task.LastTaskDataUpdate < lightweightTask.LastTaskDataUpdate && (lightweightTask.State == TaskState.Finished || lightweightTask.State == TaskState.Aborted || lightweightTask.State == TaskState.Failed || lightweightTask.State == TaskState.Paused)) { log.LogMessage(string.Format("Downloading task {0}", lightweightTask.Id)); hiveTask.IsDownloading = true; jobDownloader.DownloadTaskData(hiveTask.Task, (localJob, itemJob) => { lock (downloadFinishedLocker) { log.LogMessage(string.Format("Finished downloading task {0}", localJob.Id)); HiveTask localHiveTask = GetHiveTaskById(localJob.Id); if (itemJob == null) { // something bad happened to this task. bad task, BAAAD task! localHiveTask.IsDownloading = false; } else { // if the task is paused, download but don't integrate into parent optimizer (to avoid Prepare) if (localJob.State == TaskState.Paused) { localHiveTask.ItemTask = itemJob; } else { if (localJob.ParentTaskId.HasValue) { HiveTask parentHiveTask = GetHiveTaskById(localJob.ParentTaskId.Value); parentHiveTask.IntegrateChild(itemJob, localJob.Id); } else { localHiveTask.ItemTask = itemJob; } } localHiveTask.IsDownloading = false; localHiveTask.Task.LastTaskDataUpdate = lightweightTask.LastTaskDataUpdate; } } }); } } } GC.Collect(); // force GC, because .NET is too lazy here (deserialization takes a lot of memory) if (IsFinished()) { ExecutionState = ExecutionState.Stopped; StopResultPolling(); } else if (IsPaused()) { ExecutionState = ExecutionState.Paused; StopResultPolling(); } else { ExecutionState = ExecutionState.Started; } UpdateTotalExecutionTime(); UpdateStatistics(); OnStateLogListChanged(); OnTaskReceived(); } }
public void ThreadSafeLogThreadSafetyTest() { int count = 10000; ThreadSafeLog log = new ThreadSafeLog(); Parallel.For(0, count, (i) => { log.LogMessage("Message " + i); // write something log.Messages.Count(); // iterate over all messages }); Assert.AreEqual(count, log.Messages.Count()); }