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));
}
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é.