This documentation is archived and is not being maintained.

WorkflowInvoker::EndInvoke Method

Returns the results of a workflow that was invoked using one of the BeginInvoke() overloads.

Namespace:  System.Activities
Assembly:  System.Activities (in System.Activities.dll)

IDictionary<String^, Object^>^ EndInvoke(
	IAsyncResult^ result


Type: System::IAsyncResult
The IAsyncResult that references the BeginInvoke() operation that started the workflow.

Return Value

Type: System.Collections.Generic::IDictionary<String, Object>
A dictionary of the root activity’s OutArgument and InOutArgument values keyed by argument name that represent the outputs of the workflow.

To be notified when the workflow is complete and retrieve the output parameters of the workflow, call EndInvoke(IAsyncResult) from the callback method specified by BeginInvoke(). If EndInvoke(IAsyncResult) is called before the workflow completes, it blocks until the workflow completes.

This method returns the result of a workflow invoked asynchronously using the IAsyncResult asynchronous design pattern. For more information, seeAsynchronous Programming Overview.

The following example invokes a workflow consisting of a LongRunningDiceRoll activity. The LongRunningDiceRoll activity has two output arguments that represent the results of the dice roll operation. These are retrieved by calling EndInvoke(IAsyncResult). When the call to EndInvoke(IAsyncResult) returns, each output argument is returned in the outputs dictionary, keyed by argument name.

public sealed class LongRunningDiceRoll : Activity
    public OutArgument<int> D1 { get; set; }
    public OutArgument<int> D2 { get; set; }

    public LongRunningDiceRoll()
        this.Implementation = () => new Sequence
            Activities =
                new WriteLine
                    Text = "Rolling the dice for 5 seconds."
                new Delay
                    Duration = TimeSpan.FromSeconds(5)
                new DiceRoll
                    D1 = new OutArgument<int>(env => this.D1.Get(env)),
                    D2 = new OutArgument<int>(env => this.D2.Get(env))

static void BeginInvokeExample()
    WorkflowInvoker invoker = new WorkflowInvoker(new LongRunningDiceRoll());

    string userState = "BeginInvoke example";
    IAsyncResult result = invoker.BeginInvoke(new AsyncCallback(WorkflowCompletedCallback), userState);

    // You can inspect result determine if the workflow is complete.
    Console.WriteLine("result.IsCompleted: {0}", result.IsCompleted);

    // You can inspect result to determine if the workflow completed
    // asynchronously. This can occur if the workflow does not
    // become idle during its execution.
    Console.WriteLine("result.CompletedSynchronously: {0}", result.CompletedSynchronously);

    // The results of the workflow are retrieved by calling EndInvoke, which
    // can be called from the callback or from the host. If called from the
    // host, it blocks until the workflow completes. If a callback is not
    // required, pass null for the callback parameter.
    Console.WriteLine("Waiting for the workflow to complete.");
    IDictionary<string, object> outputs = invoker.EndInvoke(result);

    Console.WriteLine("The two dice are {0} and {1}.",
        outputs["D1"], outputs["D2"]);

static void WorkflowCompletedCallback(IAsyncResult result)
    Console.WriteLine("Workflow complete.");

.NET Framework

Supported in: 4

.NET Framework Client Profile

Supported in: 4

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.