-
Notifications
You must be signed in to change notification settings - Fork 2k
/
IAsyncObserver.cs
59 lines (56 loc) · 2.99 KB
/
IAsyncObserver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Threading.Tasks;
namespace Orleans.Streams
{
/// <summary>
/// This interface generalizes the standard .NET IObserver interface to allow asynchronous production of items.
/// <para>
/// Note that this interface is implemented by item consumers and invoked (used) by item producers.
/// This means that the consumer endpoint of a stream implements this interface.
/// </para>
/// </summary>
/// <typeparam name="T">The type of object consumed by the observer.</typeparam>
public interface IAsyncObserver<in T>
{
/// <summary>
/// Passes the next item to the consumer.
/// <para>
/// The Task returned from this method should be completed when the item's processing has been
/// sufficiently processed by the consumer to meet any behavioral guarantees.
/// </para>
/// <para>
/// When the consumer is the (producer endpoint of) a stream, the Task is completed when the stream implementation
/// has accepted responsibility for the item and is assured of meeting its delivery guarantees.
/// For instance, a stream based on a durable queue would complete the Task when the item has been durably saved.
/// A stream that provides best-effort at most once delivery would return a Task that is already complete.
/// </para>
/// <para>
/// When the producer is the (consumer endpoint of) a stream, the Task should be completed by the consumer code
/// when it has accepted responsibility for the item.
/// In particular, if the stream provider guarantees at-least-once delivery, then the item should not be considered
/// delivered until the Task returned by the consumer has been completed.
/// </para>
/// </summary>
/// <param name="item">The item to be passed.</param>
/// <param name="token">The stream sequence token of this item.</param>
/// <returns>A Task that is completed when the item has been accepted.</returns>
Task OnNextAsync(T item, StreamSequenceToken token = null);
/// <summary>
/// Notifies the consumer that the stream was completed.
/// <para>
/// The Task returned from this method should be completed when the consumer is done processing the stream closure.
/// </para>
/// </summary>
/// <returns>A Task that is completed when the stream-complete operation has been accepted.</returns>
Task OnCompletedAsync();
/// <summary>
/// Notifies the consumer that the stream had an error.
/// <para>
/// The Task returned from this method should be completed when the consumer is done processing the stream closure.
/// </para>
/// </summary>
/// <param name="ex">An Exception that describes the error that occurred on the stream.</param>
/// <returns>A Task that is completed when the close has been accepted.</returns>
Task OnErrorAsync(Exception ex);
}
}