C# Http上的下载线程直接从字节读取循环退出

C# Http上的下载线程直接从字节读取循环退出,c#,multithreading,download,httpwebresponse,C#,Multithreading,Download,Httpwebresponse,我有一个通过Http使用多线程下载的项目。它下载部分内容 对于某些URL和低下载速度,一些部分下载线程在while循环上等待太多时间而没有获取数据,并且在几次之后,线程直接退出而没有在while循环后执行代码。我不明白怎么会这样 我的代码: 在这段代码中,每个下载线程都必须在最后一行执行Debug.WriteLine代码,但其中一些线程不执行它。输出显示线程0x。。。已退出,代码为259(0x103)。用于每个线程,但不写入每个线程的线程退出 输出: 下载状态 如您所见,一些下载线程会停止并

我有一个通过Http使用多线程下载的项目。它下载部分内容

对于某些URL和低下载速度,一些部分下载线程在while循环上等待太多时间而没有获取数据,并且在几次之后,线程直接退出而没有在while循环后执行代码。我不明白怎么会这样

我的代码:

在这段代码中,每个下载线程都必须在最后一行执行Debug.WriteLine代码,但其中一些线程不执行它。输出显示
线程0x。。。已退出,代码为259(0x103)。
用于每个线程,但不写入每个线程的
线程退出

输出:

下载状态

如您所见,一些下载线程会停止并直接退出。这个问题的原因是什么

更新:

        try
        {
            while ((bytesRead = tempStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                //....
                file.Write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
            }
        }
        catch
        {
            //Refresh the connection
        }
线程创建:

public void Start()
{
任务th=新任务(()=>
{
createFirstPartitions();
});
th.Start();
}
void createFirstPartitions()
{
size=Helper.GetContentLength(url,ref-rangeAllowed,ref-url);
对于(int i=0;i
我已经为我的问题找到了一个简单的答案。解决方案是使用
HttpWebRequest.ReadWriteTimeout
。默认情况下,其值为5分钟。将其设置为可接受的时间是一个很好的解决方案

发送请求时添加
req.ReadWriteTimeout=5000

然后将代码部分更改为:

        try
        {
            while ((bytesRead = tempStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                //....
                file.Write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
            }
        }
        catch
        {
            //Refresh the connection
        }

您的线程以非零退出代码退出(即出现错误,可能是由于异常)。输出窗口告诉您什么?这些是在代码中创建的下载线程。前七个线程成功,其他线程未成功。输出还显示
程序'[3988]多线程Downloder.vshost.exe:程序跟踪'已退出,代码为0(0x0)。
程序'[3988]多线程Downloder.vshost.exe'已退出,代码为0(0x0)。
此外,您还没有向我们显示线程部分。。。
from
to
来自哪里?和
等待
?我已经更新了我的问题
wait
是一个简单的变量,它可以帮助我等待线程几毫秒,以保持其变量不变,直到某些操作完成
from
to
是为创建部分内容而计算的范围变量。
        try
        {
            while ((bytesRead = tempStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                //....
                file.Write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
            }
        }
        catch
        {
            //Refresh the connection
        }