-
-
Notifications
You must be signed in to change notification settings - Fork 358
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
AsyncCollection IsEmpty #264
Comments
Any suggestions on this? |
@romerod @StephenCleary It seems to me that the inner wait loop in
while (Empty && !_completed && !cancellationToken.IsCancellationRequested)
{
if (sync)
{
_completedOrNotEmpty.Wait(cancellationToken);
}
else
{
await _completedOrNotEmpty.WaitAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
}
} I appreciate that as this is async, it might still have the occasional I think var cancelledToken = new CancellationToken(true);
while (true)
{
IList<Message> buffer = new List<Message>(10000);
buffer.Add(await asyncQueue.TakeAsync());
var count = 1;
while (count < buffer.Count && await asyncQueue.OutputAvailableAsync(cancelledToken))
{
try
{
// take currently available items
var message = await asyncQueue.TakeAsync(cancelledToken);
if (message == null) break;
buffer[count] = message;
count++;
}
catch (InvalidOperationException) // Thown if the producer completes
{
break;
}
}
await SendMessagesAsync(buffer, count);
} I think that perhaps the @romerod As this is open source, you could just include a private copy of the AsyncCollection class, modified for your needs if necessary... |
No; there's too much potential for misuse; with concurrent/asynchronous collections, any However, there is a better way to meet your need: a |
We are using the AsyncCollection to queue messages that have to be sent to a server. The send operation usually takes some time and sending multiple messages at once is faster than sending each message separetely.
Currently we have something like this:
This works great except that the debug output is flooded with TaskCanceledExceptions, especially when the functionality is used in a request/response scenario when messages do not pile up.
Would it be possible to expose the Empty and/or Count property or have a method which gets a specified number of items which are currently available?
The text was updated successfully, but these errors were encountered: