web-dev-qa-db-fra.com

'stream.ReadTimeout' a levé une exception de type 'System.InvalidOperationException' envoyant une photo au bot de télégramme

J'ai écrit ci-dessous le code pour envoyer une photo à mon bot, mais dans mon flux, j'ai deux exceptions pour la lecture et l'écriture et ma photo n'a pas été envoyée.

Je pense que peut-être la raison était cette erreur, mais je n'ai pas pu la réparer:

stream.ReadTimeout a levé une exception de type 'System.InvalidOperationException'

using (var stream = System.IO.File.Open("a.jpg", FileMode.Open))
{
    var fileToSend = new FileToSend("a.jpg", stream);
    Task.Run(() => bot.SendPhotoAsync(u.Message.Chat.Id, fileToSend).ConfigureAwait(false));
}
8
Mary Qafarinia

La raison de cette exception est probablement que vous Dispose le stream immédiatement après avoir démarré la tâche.

L'instruction using appelle Dispose sur l'instance stream lorsque l'exécution quitte ce bloc. Vous pouvez supprimer cette instruction using ou - si votre méthode est déjà async - vous pouvez simplement await l'appel à SendPhotoAsync(). Il n'y a aucune raison d'utiliser un autre thread avec Task.Run():

using (var stream = System.IO.File.Open("a.jpg", FileMode.Open))
{
    var fileToSend = new FileToSend("a.jpg", stream);
    await bot.SendPhotoAsync(u.Message.Chat.Id, fileToSend).ConfigureAwait(false);
}

La machine d'état créée par le compilateur pour cet appel await veille à ce que le bloc finally de l'instruction using (où stream.Dispose() sera appelé) est exécuté uniquement après que Task retourné par SendPhotoAsync est terminé.

8
René Vogt