internal bool InternalStart(TaskScheduler scheduler, bool inline, bool throwSchedulerExceptions)
{
ExecutingTaskScheduler = scheduler;
var result = Interlocked.CompareExchange(ref _status, (int)TaskStatus.WaitingForActivation, (int)TaskStatus.Created);
if (result != (int)TaskStatus.Created && result != (int)TaskStatus.WaitingForActivation)
{
return(false);
}
var didInline = false;
try
{
if (inline)
{
// Should I worry about this task being a continuation?
// WaitAntecedent(CancellationToken);
didInline = scheduler.InternalTryExecuteTaskInline(this, IsScheduled);
}
if (!didInline)
{
scheduler.QueueTask(this);
Interlocked.CompareExchange(ref _status, (int)TaskStatus.WaitingToRun, (int)TaskStatus.WaitingForActivation);
}
else
{
PrivateWait(CancellationToken, false);
}
}
catch (ThreadAbortException exception)
{
if (didInline)
{
return(true);
}
AddException(exception);
FinishThreadAbortedTask(true, false);
}
catch (Exception exception)
{
var taskSchedulerException = new TaskSchedulerException(exception);
RecordException(taskSchedulerException);
if (throwSchedulerExceptions)
{
throw taskSchedulerException;
}
}
return(true);
}