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

In This Topic
    SearchAndSubscribe Method (RealtimeFeatureClass)
    In This Topic
    Searches the feature class for existing rows using the query criteria and then subscribes to receive row events. This method must be called on the MCT. Use QueuedTask.Run.
    Syntax
    Public Function SearchAndSubscribe( _
       ByVal queryFilter As QueryFilter, _
       ByVal useRecyclingCursor As Boolean _
    ) As RealtimeCursor

    Parameters

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

    Return Value

    A RealtimeCursor that encapsulates the retrieved rows, as well as provides facilities to wait for new row events.
    Exceptions
    ExceptionDescription
    A geodatabase-related exception has occurred.
    Remarks
    This method is thread-safe and it can be called on any thread. If the cursor is disposed or in the process of being disposed when this method is called it will result in undefined behavior. This operation is atomic. It is guaranteed that the returned RealtimeCursor will correctly reflect any insert or delete operations that occured at any time during the exection of this method. If no query filter is set, all pre-existing rows will be searched and all rows that become available after subscribing will be retrieved.
    Example
    Search And Subscribe for Streaming Data
    await QueuedTask.Run(async () =>
    {
      //query filter can be null to search and retrieve all rows
      //true means recycling cursor
      using (var rc = streamLayer.SearchAndSubscribe(qfilter, true))
      {
        //waiting for new features to be streamed
        //default is no cancellation
        while (await rc.WaitForRowsAsync())
        {
          while (rc.MoveNext())
          {
            using (var row = rc.Current)
            {
              //determine the origin of the row event
              switch (row.GetRowSource())
              {
                case RealtimeRowSource.PreExisting:
                  //pre-existing row at the time of subscribe
                  continue;
                case RealtimeRowSource.EventInsert:
                  //row was inserted after subscribe
                  continue;
                case RealtimeRowSource.EventDelete:
                  //row was deleted after subscribe
                  continue;
              }
            }
          }
        }
      }//row cursor is disposed. row cursor is unsubscribed
    
      //....or....
      //Use the feature class instead of the layer
      using (var rfc = streamLayer.GetFeatureClass())
      {
        //non-recycling cursor - 2nd param "false"
        using (var rc = rfc.SearchAndSubscribe(qfilter, false))
        {
          //waiting for new features to be streamed
          //default is no cancellation
          while (await rc.WaitForRowsAsync())
          {
            //etc
          }
        }
      }
    });
    Search And Subscribe With Cancellation
    await QueuedTask.Run(async () =>
    {
      //Recycling cursor - 2nd param "true"
      //or streamLayer.Subscribe(qfilter, true) to just subscribe
      using (var rc = streamLayer.SearchAndSubscribe(qfilter, true))
      {
        //auto-cancel after 20 seconds
        var cancel = new CancellationTokenSource(new TimeSpan(0, 0, 20));
        //catch TaskCanceledException
        try
        {
          while (await rc.WaitForRowsAsync(cancel.Token))
          {
            //check for row events
            while (rc.MoveNext())
            {
              using (var row = rc.Current)
              {
                //etc
              }
            }
          }
        }
        catch (TaskCanceledException )
        {
          //Handle cancellation as needed
        }
        cancel.Dispose();
      }
    });
    Requirements

    Target Platforms: Windows 11, Windows 10

    ArcGIS Pro version: 3 or higher.
    See Also