首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# StreamReader:如何绑定同步ReadBlock调用的最大时间?

C# StreamReader:如何绑定同步ReadBlock调用的最大时间?
EN

Stack Overflow用户
提问于 2018-02-15 15:11:14
回答 1查看 167关注 0票数 1

我想限制读取一个流所能花费的最大时间。ReadTimeout属性不限制最大时间,它仅在ReadTimeout窗口中没有接收到数据时才适用。如何确保下面的代码执行时间不超过N秒,如果超过N秒,我想取消并释放所有底层资源。

代码语言:javascript
复制
          using (WebResponse response = ExecuteHttpRequest(
                httpRequestInputs.EndpointUrl,
                new HttpMethod(httpRequestInputs.Method),
                httpRequestInputs.Body,
                httpRequestInputs.Headers))
            {
                statusCode = ((HttpWebResponse)response).StatusCode;

                using (var responseStream = response.GetResponseStream())
                {
                    using (var streamReader = new StreamReader(responseStream))
                    {
                        var responseContent = new char[m_maxResponseSizeToBeRead];
                        var bytesRead = streamReader.ReadBlock(responseContent, 0, m_maxResponseSizeToBeRead);
                        if (!streamReader.EndOfStream){
                            isResponseSizeLimitExceeded = true;
                        }
                        else
                        {
                            result = new String(responseContent, 0, bytesRead);
                        }
                    }
                }
            }

我是否可以将其封装在某个任务中,然后在N秒后取消该任务?这会释放任务中创建的资源吗?

EN

回答 1

Stack Overflow用户

发布于 2018-02-15 15:49:35

您可以轻松继承StreamReader并添加自己的功能:

代码语言:javascript
复制
public class StreamReaderWithMaxTime : StreamReader
{
    public TimeSpan MaxTime { get; set; } = new TimeSpan(0, 1, 0);
    public DateTime? Start { get; set; }

    public override int ReadBlock(char[] buffer, int index, int count)
    {
        if (Start == null)
            Start = DateTime.Now;

        if (Start.Value.Add(MaxTime) < DateTime.Now)
            throw new Exception("Timeout! Max readtime reached!");

        int result = 0;
        Thread t = new Thread(() => result = base.ReadBlock(buffer, index, count));
        t.Start();
        if (!t.Join(Start.Add(MaxTime) - DateTime.Now))
        {
            t.Abort();
            throw new Exception("Timeout! Max readtime reached!");
        }

        return result;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48801684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档