ArcGIS Pro 3.7 API Reference Guide
ArcGIS.Desktop.Mapping Namespace / StreamLayer Class / Subscribe Method
A null query filter will cause all rows that become available to be retrieved.
If set to true, all the entries in ArcGIS.Core.Data.Realtime.RealtimeCursor will reference the most current row returned by ArcGIS.Core.Data.Realtime.RealtimeCursor.Current. To ensure all the entries in ArcGIS.Core.Data.Realtime.RealtimeCursor remain unique, set useRecyclingCursor to false. The default is true.
Example

In This Topic
    Subscribe Method (StreamLayer)
    In This Topic
    Subscribe to receive row events. This method must be called on the MCT. Use QueuedTask.Run.
    Syntax

    Parameters

    queryFilter
    A null query filter will cause all rows that become available to be retrieved.
    useRecyclingCursor
    If set to true, all the entries in ArcGIS.Core.Data.Realtime.RealtimeCursor will reference the most current row returned by ArcGIS.Core.Data.Realtime.RealtimeCursor.Current. To ensure all the entries in ArcGIS.Core.Data.Realtime.RealtimeCursor remain unique, set useRecyclingCursor to false. The default is true.

    Return Value

    A ArcGIS.Core.Data.Realtime.RealtimeCursor that encapsulates the retrieved rows, as well as provides facilities to wait for new row events.
    Exceptions
    ExceptionDescription
    This method or property must be called within the lambda passed to QueuedTask.Run.
    Stream Layer was disconnected from its underlying feature class.
    A geodatabase-related exception has occurred.
    Remarks
    Use ArcGIS.Core.Data.Realtime.RealtimeFeatureClass.Subscribe to subscribe on any thread. As opposed to SearchAndSubscribe, this method does not perform a Search before subscribing. As a consequence, the returned ArcGIS.Core.Data.Realtime.RealtimeCursor will only iterate over rows that became available immediately after the execution of this method. If no query filter is set, all rows that become available will be retrieved.
    Example
    Subscribe to Streaming Data
    {
      //Note: with feature class we can also use a System Task to subscribe and
      //process rows
      // Note: call within QueuedTask.Run()
      {
        // or var rfc = realtimeDatastore.OpenTable(name) as RealtimeFeatureClass
        using RealtimeFeatureClass rfc = streamLayer.GetFeatureClass();
        //non-recycling cursor - 2nd param "false"
        //subscribe, pre-existing rows are not searched
        using RealtimeCursor rc = rfc.Subscribe(qfilter, false);
        SpatialQueryFilter spatialFilter = new SpatialQueryFilter();
        //waiting for new features to be streamed
        //default is no cancellation
        while (rc.WaitForRowsAsync().Result)
        {
          while (rc.MoveNext())
          {
            using (var row = rc.Current)
            {
              switch (row.GetRowSource())
              {
                case RealtimeRowSource.EventInsert:
                  //getting geometry from new events as they arrive
                  Polygon poly = ((RealtimeFeature)row).GetShape() as Polygon;
    
                  //using the geometry to select features from another feature layer
                  spatialFilter.FilterGeometry = poly;//project poly if needed...
                  featureLayer.Select(spatialFilter);
                  continue;
                default:
                  continue;
              }
            }
          }
        }
        //row cursor is disposed. row cursor is unsubscribed
      }
    }
    Search Existing Data and Subscribe for Streaming Data
    {
      //Note we can use System Task with the Realtime feature class
      //for subscribe
    
      // Note: call within QueuedTask.Run()
      {
        using RealtimeFeatureClass rfc = streamLayer.GetFeatureClass();
        //non-recycling cursor - 2nd param "false"
        using RealtimeCursor rc = rfc.SearchAndSubscribe(qfilter, false);
    
        //waiting for new features to be streamed
        //default is no cancellation - use await in async method
        while (rc.WaitForRowsAsync().Result)
        {
          //pre-existing rows will be retrieved that were searched
          while (rc.MoveNext())
          {
            using RealtimeRow row = rc.Current;
            var row_source = row.GetRowSource();
            switch (row_source)
            {
              case RealtimeRowSource.EventDelete:
                //TODO - handle deletes
                break;
              case RealtimeRowSource.EventInsert:
                //TODO handle inserts
                break;
              case RealtimeRowSource.PreExisting:
                //TODO handle pre-existing rows
                break;
            }
          }
        }
        //row cursor is disposed. row cursor is unsubscribed
      }
    }
    Search And Subscribe With Cancellation 2
    {
      // Note: call within QueuedTask.Run()
      {
        using RealtimeFeatureClass rfc = streamLayer.GetFeatureClass();
        //Recycling cursor - 2nd param "true"
        using RealtimeCursor rc = rfc.SearchAndSubscribe(qfilter, true);
        //auto-cancel after 20 seconds
        var cancel = new CancellationTokenSource(new TimeSpan(0, 0, 20));
        //catch TaskCanceledException
        try
        {
          // Use await in async method
          while (rc.WaitForRowsAsync(cancel.Token).Result)
          {
            //check for row events
            while (rc.MoveNext())
            {
              using RealtimeRow record = rc.Current;
              // Process the record
            }
          }
        }
        catch (TaskCanceledException)
        {
          //Handle cancellation as needed
        }
        cancel.Dispose();
      }
    }
    Requirements

    Target Platforms: Windows 11 Home, Pro, Enterprise (64 bit)

    ArcGIS Pro version: 3.0 or higher.
    See Also