.IsCompleted
указывает на то, что конец канала, в смысле сокета и т. Д., Является закрытым (в отличие от того, чтобы быть открытым, но не иметь больше данных прямо сейчас);Я ожидаю , что здесь происходит, так это то, что вы:
- извлекаете буфер чтения
- читаете весь буфер в поисках последовательности и не находите ее
- поэтому обрабатывает ноль байтов
- и поэтому говорит:
.AdvanceTo(zero)
Есть важная вторая перегрузка AdvanceTo
- вы не должны просто сказать, что вы потребляемая ;Вы должны сказать ему, что вы осмотрели , что в данном случае, вероятно, является: всем ;это может помочь избежать застревания в горячей петле, разбирающей один и тот же неполный кадр снова и снова, снова и снова и снова.Например, один из моих циклов чтения выглядит (упрощенно):
while (true)
{
var readResult = await input.ReadAsync();
var buffer = readResult.Buffer;
int handled = TryConsume(ref buffer); // note: this **changes** buffer, slicing (Slice)
// data from the start; when TryConsume exits, it will contain everything
// that is *left*, but we will have effectively examined all of it; we will
// have consumed any complete frames that we can from it
// advance the pipe
input.AdvanceTo(buffer.Start, buffer.End);
// exit if we aren't making progress, and nothing else will be forthcoming
if (handled == 0 && readResult.IsCompleted)
{
break; // no more data, or trailing incomplete messages
}
}