Stream: смешайте Write и WriteAsyn c в одной процедуре - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь переписать старый код с концепцией async / await.

Рассмотрим следующий упрощенный код:

public async Task<bool> Foo()
{
   using (var stream = new Stream()); // Any stream allowing async operations
   ....
   stream.Write(0xff);
   var bytes = new byte[];
   // fill bytes
   await stream.WriteAsync(bytes, 0, bytes.Length);
   ....
   stream.Write(0xff);
   // refill bytes
   await stream.WriteAsync(bytes, 0, bytes.Length);
   ....
   await stream.FlushAsync();
}

Итак, мой вопрос: безопасно ли смешивать Write и WriteAsync вызывает одну и ту же процедуру? Какие здесь могут быть подводные камни? Заранее спасибо.

1 Ответ

1 голос
/ 13 июля 2020

Этот метод безопасен в том смысле, что изолированно он будет вести себя так, как вы предполагали: каждый Write / WriteAsync будет происходить последовательно, потому что ожидаются записи asyn c.

This как сказано, с точки зрения вызывающих абонентов, смешивать в реализации syn c и asyn c далеко не идеально. что это неблокирующий. Бывают ситуации, когда метод asyn c должен запустить какой-то дорогостоящий код ЦП, прежде чем asyn c заработает, но это не одна из таких ситуаций; было бы предпочтительнее использовать WriteAsync для каждой записи.

...