Activity delegates enable activity authors to expose callbacks with specific signatures that users of the activity can provide activity-based handlers for. There are two types of activity delegates: ActivityAction<T> is used for invoking activities that do not have a return value, and ActivityFunc<TResult> is used for invoking activities that do have a return value. Activity delegates are useful in scenarios where a child activity must be constrained to having a certain signature.