J'utilise le BlockingCollection
pour un modèle de Producteur Consommateur et j'ai eu une excecption je pense à écrire un brevet dessus-seulement deux résultats dans google! le expection est « CompleteAdding ne peut pas être utilisé en même temps avec des ajouts à la collection » et il arrive quand je TryAdd
sur e BlockingCollection comme suit:exception très unique pour BlockingCollection sur .net 4.0
public void EnqueueTask(T item)
{
if (!_cancellationTokenSource.IsCancellationRequested)
{
_workerQueue.Add(item);
}
}
la CompleteAdding
est appelée sur la Éliminez de la classe emballage consommateur-producteur :
public void Dispose()
{
if (!_IsActive)
return;
_IsActive = false;
_cancellationTokenSource.Cancel();
_workerQueue.CompleteAdding();
// Wait for the consumer's thread to finish.
for (int i = 0; i < _workers.Length; ++i)
{
Task t1 = Task.Factory.StartNew(() =>
{
try
{
if (!_workers[i].Join(4000))
LogWriter.Trace("Failed to join thread", "ThreadFailureOnDispose");
}
catch (Exception ex)
{
OnLogged(ex.Message + ex.StackTrace);
}
});
}
// Release any OS resources.
}
Quelqu'un de Microsoft a une idée? devrais-je dormir après l'annulation et avant d'appeler le CompleteAdding?
Quel est le type de l'exception? La documentation indique que 'Add' (et' TryAdd') lancera 'InvalidOperationException' si vous essayez d'ajouter un élément après que' CompleteAdding' a été appelé. Votre description n'est pas trop claire, mais si vous obtenez l'exception sur l'appel 'Add', je suppose que c'est ça. –