2014-05-09 8 views
2

J'implémente PubSub en utilisant MongoDB. Si je crée ma requête spécifiant un TailableCursor avec NoCursorTimeout:Comment annuler l'opération MoveNext sur le curseur de disponibilité

using(var enumerator = _Collection.FindAs<BsonDocument>(Query.GTE("CreationTimeUTC", DateTime.UtcNow)) 
    .SetFlags(QueryFlags.AwaitData | QueryFlags.NoCursorTimeout | QueryFlags.TailableCursor) 
    .SetSortOrder(SortBy.Ascending("$natural")).GetEnumerator)) 
{ 
    while(true) 
    { 
     if(enumerator.MoveNext()) 
     { 
      //process the message here 
     } 
    } 
} 

blocs MoveNext() indéfiniment (ou jusqu'à ce que les données sont disponibles ou si une erreur se produit). Si je veux forcer MoveNext() à retourner (par exemple, si je veux annuler l'écoute), comment le faire? Appelez Dispose() sur l'énumérateur ou le curseur?

Répondre

1

Si vous ne définissez pas un délai d'attente sur le curseur, c'est à peu près tout ce que vous pouvez faire, tant que la méthode MoveNext n'accepte pas de CancellationToken. Il suffit de disposer de l'énumérateur, attraper le ObjectDisposedException et passer à autre chose.

J'ai un exemple de solution pour un cas similaire here. qui dans ce cas serait:

try 
{ 
    using(enumerator.CreateTimeoutScope(TimeSpan.FromHours(1))) 
    { 
     while(true) 
     { 
      if(enumerator.MoveNext()) 
      { 
       //process the message here 
      } 
     } 
    } 
} 
catch (ObjectDisposedException) 
{ 
} 
Questions connexes