예제 #1
0
    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();
      }
    }
예제 #2
0
        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());
        }