web-dev-qa-db-ja.com

「stream.ReadTimeout」はタイプ「System.InvalidOperationException」の例外をスローし、テレグラムボットに写真を送信しました

写真をボットに送信するためのコードを以下に記述しましたが、ストリームでは読み取りと書き込みの2つの例外があり、写真は送信されませんでした。

おそらくこの理由はこのエラーだったと思いますが、修正できませんでした。

stream.ReadTimeoutタイプ '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

この例外の理由は、おそらくタスクを開始した直後にDisposestreamであるためです。

usingステートメントは、実行がこのブロックを離れるときに、Disposeインスタンスでstreamを呼び出します。このusingステートメントを削除するか、またはメソッドがすでにasyncである場合は、SendPhotoAsync()への呼び出しを単にawaitすることができます。 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);
}
_

このawait呼び出し用にコンパイラーによって作成されたステートマシンは、finallyステートメントのusingブロック(stream.Dispose()が呼び出される)を処理しますTaskによって返されたSendPhotoAsyncが完了した後にのみ実行されます。

8
René Vogt