Sample code for 30+ languages & platforms
Xbase++

Async Task Chain

See more Async Examples

Demonstrates how to combine a sequence of asynchronous tasks into a single task chain to be run in a background thread.

Chilkat Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oMailman
LOCAL nNumMessages
LOCAL oTaskChain
LOCAL i
LOCAL oTask
LOCAL oEmail
LOCAL nNumTasks
LOCAL nTaskIdx

nSuccess := 0

//  This example assumes the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

nSuccess := 0

oMailman := CreateObject("Chilkat.MailMan")

//  Set the POP3 server's hostname
oMailman:MailHost := "pop.example.com"

//  Set the POP3 login/password and any other requirements..
oMailman:PopUsername := "myLogin"
oMailman:PopPassword := "myPassword"
oMailman:PopSsl := 1
oMailman:MailPort := 995

//  Connect to the POP3 server:
nSuccess := oMailman:Pop3BeginSession()
IF (.NOT. nSuccess)
    ? oMailman:LastErrorText
    oMailman:destroy()
    RETURN
ENDIF

//  Get the number of messages in the mailbox.
nNumMessages := oMailman:GetMailboxCount()
IF (nNumMessages == 0)
    ? "No email messages in the POP3 mailbox."
    oMailman:destroy()
    RETURN
ENDIF

oTaskChain := CreateObject("Chilkat.TaskChain")

//  Create async task objects to fetch each email message
//  by its sequence number

FOR i := 1 TO nNumMessages

    oTask := oMailman:FetchByMsgnumAsync(i)
    IF (oMailman:LastMethodSuccess == 0)
        ? oMailman:LastErrorText
        oMailman:destroy()
        oTaskChain:destroy()
        RETURN
    ENDIF

    //  Append each task to the task chain.
    nSuccess := oTaskChain:Append(oTask)
    IF (.NOT. nSuccess)
        ? oTaskChain:LastErrorText
        oMailman:destroy()
        oTaskChain:destroy()
        RETURN
    ENDIF

    oTask:destroy()

NEXT

//  At this point, no tasks have actually started running.
//  All we've done so far is to create tasks for the work that will be done
//  when the task chain is run.

//  Start the task chain running in a background thread.
//  Each task is run one after the other (on the same background thread) until all tasks have completed.
//  The task chain will stop at the first task that fails.
oTaskChain:StopOnFailedTask := 1
nSuccess := oTaskChain:Run()
IF (.NOT. nSuccess)
    ? oTaskChain:LastErrorText
    oMailman:destroy()
    oTaskChain:destroy()
    RETURN
ENDIF

//  The application is now free to do anything else
//  while the emails are being downloaded

//  For this example, we'll simply sleep and periodically
//  check to see if the taskchain if finished. 
DO WHILE oTaskChain:Finished != 1

    //  Sleep 100 ms.
    oTaskChain:SleepMs(100)

ENDDO

//  A finished task chain could be one that was canceled, aborted, or truly finished.  

//  If the task chain "completed", then it ran to completion.  A "completed" task will
//  have a StatusInt equal to 7.   If the task finished, but was not completed, then it must've
//  been aborted or canceled:
IF (oTaskChain:StatusInt != 7)
    ? "Task did not complete."
    ? "task chain status: " + oTaskChain:Status
    oMailman:destroy()
    oTaskChain:destroy()
    RETURN
ENDIF

oEmail := CreateObject("Chilkat.Email")

nNumTasks := oTaskChain:NumTasks
nTaskIdx := 0

DO WHILE (nTaskIdx < nNumTasks)

    oTask := oTaskChain:GetTask(nTaskIdx)

    //  Load the email object with email downloaded by this task.
    nSuccess := oEmail:LoadTaskResult(oTask)
    IF (.NOT. nSuccess)
        ? "Failed to load email object for task."
    ELSE
        ? oEmail:From + "; " + oEmail:Subject
    ENDIF

    oTask:destroy()

    nTaskIdx := nTaskIdx + 1
ENDDO

oMailman:destroy()
oTaskChain:destroy()
oEmail:destroy()