Я получаю поток из HttpWebResponse.GetResponseStream()
, откуда я читаю данные.
Теперь я хочу реализовать свойство Timeout
. Самый простой способ сделать это - stream.ReadTimeout = timeout
, но это выдает InvalidOperationException -> Timeouts are not supported on this stream
.
Учитывая это, я пытаюсь реализовать свойство timeout самостоятельно, но застрял на удалении. Вот что я получил до сих пор:
public class MyStream : Stream {
private readonly Stream _src;
public override int ReadTimeout { get; set; }
public MyStream (Stream src, int timeout) {
ReadTimeout = timeout;
_src = src;
}
public override int Read(byte[] buffer, int offset, int count) {
var timer = new AutoResetEvent(false);
int read = 0;
ThreadPool.QueueUserWorkItem(
_ => {
read = _src.Read(buffer, offset, count);
timer.Set();
});
bool completed = timer.WaitOne(ReadTimeout);
if (completed) {
return read;
}
throw new TimeoutException(string.Format("waited {0} miliseconds", ReadTimeout));
}
Проблема с этим кодом заключается в том, что после броска TimeoutException
, где-то правильно обрабатывается. Выдает исключение для _src.Read(buffer, offset, count)
, говорящее о том, что поток _src был удален.
Есть ли способ отменить метод ThreadPool или я должен использовать лучший подход и какой?
Спасибо
EDIT
Как спросил @JotaBe, вот код, из которого я получаю поток из HttpWebResponse:
_httpRequest = WebRequest.CreateHttp(url);
_httpRequest.AllowReadStreamBuffering = false;
_httpRequest.BeginGetResponse(
result =>
{
try {
_httpResponse = (HttpWebResponse)_httpRequest.EndGetResponse(result);
stream = _httpResponse.GetResponseStream();
}
catch (WebException) {
downloadCompleted.Set();
Abort();
}
finally {
downloadCompleted.Set();
}
},
null);
bool completed = downloadCompleted.WaitOne(15 * 1000);
if (completed) {
return new MyStream(stream, 10000);
}