Work Item States
The CheckState() method on WorkItemThread determines the current state of the thread. Table 1 lists the supported states of a work item thread. CheckState() is called by a work item periodically during execution to check the state. For now, assume that the method looks at the current state of the thread and handles any state change requests by transitioning into the appropriate state. CheckState() returns a true value if the work item should continue, or a false value if it should terminate. Only Canceled, Terminated, and Finished states cause a false return value.
Value | Meaning |
Running | Thread is currently running. |
Finished | Thread has completed execution. This value does not indicate whether the thread completed successfully or not. |
Pausing | Request to pause the thread has been received but the thread has not yet paused. |
Paused | Thread is currently paused. |
Resuming | Request to resume the thread has been received but the thread has not yet resumed. |
Canceling | Request to cancel the thread has been received but the thread has not yet cancelled. |
Canceled | Thread has been cancelled. |
Terminating | Request to terminate the thread has been received but the thread has not yet terminated. |
Terminated | Thread has been terminated. |
A typical work item might perform work this way:
While some condition If CheckState() Do work... Else Terminate End If End While
This model is the same model used by cooperative multitasking systems. The net effect is that the more often CheckState() is called, the more responsive the work item is to user requests at a cost of slowing down the work item.
Each time the work item thread changes state, the StateChanged event is raised. Since a work item may be shared between several threads, it is possible that state change requests will not necessarily take effect. For example, if thread A sends a pause request to a work item thread, then the thread transitions to the Pausing state. If thread B sends a cancel request to the same work item thread, then the thread transitions to the Canceling state, even though it never entered the Paused state. This is important to remember when working with work items across multiple threads.