1. At a computer system including one or more processors and system memory, a method for executing code in accordance with a task directed acyclic graph that divides processing into tasks, the method comprising: an act of initiating execution of a task included in the task directed acyclic graph; an act of spawning a plurality of concurrently executable sub-tasks during the time the task is executing, each sub-task configured to perform an indicated portion of work related to the task; for each of the plurality of concurrently executable sub-tasks: an act of attaching the sub-task as a child task of the task within the task directed acyclic graph such that the task is also the parent task of the sub-task task within the task directed acyclic graph; an act of grouping the sub-task with any other sub-tasks attached to the task within the context of the task; and an act of preventing completion of the task until the attached sub-task is complete; an act of a multi-core processor concurrently executing each of the plurality of concurrently executable sub-tasks to perform the indicated portions of work related to the task, each of the plurality of concurrently executable sub-tasks concurrently executed with at least one other task at the computer system; an act of the task receiving a plurality of exceptions thrown by a subset of the plurality of concurrently executable sub-tasks; an act of the task observing at least some of the plurality of exceptions within the context of the task provided by a state object; an act of aggregating remaining exceptions not observed by the task into an exception array; an act of providing the remaining exceptions in the exception array to a portion of code that is joined with execution of the task; and upon detecting that all attached sub-tasks have completed, an act of permitting the task to complete.