示例#1
0
 /// <summary>
 /// If a task uses no shared resources, deadlock will be avoided. Otherwise,
 /// call is delegated to a manager that uses Banker's algorithm and decides whether deadlock can be avoided <see cref="IBankerAlgorithm"/>.
 /// </summary>
 private bool CanAvoidDeadlock(PrioritizedLimitedTask task)
 {
     lock (schedulingLocker)
     {
         RequestApproval approved = RequestApproval.Approved;
         if (task.UsesSharedResources())
         {
             approved = sharedResourceManager.AllocateResources(task.PrioritizedLimitedTaskIdentifier
                                                                , task.SharedResources);
         }
         return(approved == RequestApproval.Approved);
     }
 }
示例#2
0
 /// <summary>
 /// Starts (creates and schedules) task that is used to cooperatively cancels (and optionally pauses) user's task.
 /// Is user's task used resources, resources are released.
 /// This task is scheduled using default .NET scheduler.
 /// </summary>
 /// <param name="task">Corresponding user's task</param>
 /// <param name="controlNumberOfExecutionTasksAction">Responsible for decrementing number of currently running tasks</param>
 /// <param name="enablePauseAction">Responsible for pausing this callback for specific amount of time (optional)</param>
 protected void StartCallback(PrioritizedLimitedTask task, Action controlNumberOfExecutionTasksAction, Action enablePauseAction = null)
 => Task.Factory.StartNew(() =>
 {
     Task.Delay(task.DurationInMiliseconds).Wait();
     enablePauseAction?.Invoke();
     task.CooperationMechanism.Cancel();
     // Free shared resources
     if (task.UsesSharedResources())
     {
         sharedResourceManager.FreeResources(task.PrioritizedLimitedTaskIdentifier, task.SharedResources);
     }
     controlNumberOfExecutionTasksAction.Invoke();
     RunScheduling();
 }, CancellationToken.None, TaskCreationOptions.None, Default);