To monitor the state of a Task, use the PropertyCollector.WaitForUpdatesEx method.

You can monitor the values of TaskInfo properties, which change as the Task runs to completion. For example, you can check the values of startTime, queueTime, completeTime, progress, result, and state as the operation progresses. Monitor these properties in your code in a separate thread until the Task completes, while the main line of your code continues with other activities.

For more information about monitoring properties, see Client Data Synchronization with WaitForUpdatesEx.

Your code must handle the datatype returned when the Task completes (managed object reference, data object, and so on). In addition to success, queued, and running, an operation can enter an error state, which your code must handle.

A Task object has a lifecycle that is independent of the TaskManager that creates it and independent of the entity with which it is associated. It exists to convey status about an operation. You can discard the reference to it when your application no longer needs the information.

The following example shows a code fragment that obtains values for the info property from each Task object in the array.

Displaying TaskInfoState Values for Tasks in recentTask Array

...
private void displayTasks(ObjectContent[] oContents) {
      for(int oci=0; oci<oContents.length; ++oci) {
         System.out.println("Task");
         DynamicProperty[] dps = oContents[oci].getPropSet();
         if(dps!=null) {
            String op="", name="", type="", state="", error="";
            for(int dpi=0; dpi<dps.length; ++dpi) {
               DynamicProperty dp = dps[dpi];
               if("info.entity".equals(dp.getName())) {
                  type = ((ManagedObjectReference)dp.getVal()).getType();
               } else if ("info.entityName".equals(dp.getName())) {
                  name = ((String)dp.getVal());
               } else if ("info.name".equals(dp.getName())) {
                  op = ((String)dp.getVal());
               } else if ("info.state".equals(dp.getName())) {
                  TaskInfoState tis = (TaskInfoState)dp.getVal();
                  if(TaskInfoState.error.equals(tis)) {
                     state = "-Error";
                  } else if(TaskInfoState.queued.equals(tis)) {
                     state = "-Queued";
                  } else if(TaskInfoState.running.equals(tis)) {
                     state = "-Running";
                  } else if(TaskInfoState.success.equals(tis)) {
                     state = "-Success";
                  }
               } else if ("info.cancelled".equals(dp.getName())) {
                  Boolean b = (Boolean)dp.getVal();
                  if(b != null && b.booleanValue()) {
                     state += "-Cancelled";
                  }
              }...

Sample Run of the TaskList Java Application shows output from a run of the program. See the source code listing for TaskList.java or for TaskList.cs in the vSphere Web Services SDK package for details.

Sample Run of the TaskList Java Application

java com.vmware.samples.general.TaskList --url https://srv/sdk --username root --password *******

Started
Task
Operation AcquireCimServicesTicket
Name srv
Type HostSystem
State -Success
Error
======================
Ended TaskList