服务端代码:
FileStream f = ...;
Response.Clear();
Response.Buffer = true;
Response.AddHeader(...)
...
try
    while (Response.IsClientConnected)
    {
         bytes[] b = new bytes[1024];
         int len = f.Read(buffer, 0, 1024);
         Response.OutputStream.Write(b, len);
         ....
    }
finally
   {
      释放资源
   }在下载过程中,客户端点取消,Response.IsClientConnected一直为true,要等很长时间(估计要把文件读完)后才能响应客户端其他操作。
有什么办法,在客户端点了取消后,直接跳出循环?

解决方案 »

  1.   

    不可能,其实如果你这段代码,如果是写在page_load事件或者某个事件中的话,那么其实对于Response.IsClientConnected判断没有任何意义,因为你很难判断在服务器端判断客户端是否断开了。用Session来代替看是否可以能达到你要求的效果。
      

  2.   

    to Knight94(愚翁) 
    用Session怎么做呢?to zlkingdom(风之悲伤) :
    客户端取消的时候能发回指令?怎么截获IE那个下载提示框的取消事件?
      

  3.   

    to 用Session怎么做呢?例如:
    // server side
    while( Session["Download"] != null &&  Session["Download"].ToString() == "true" )
    {
    //Download file
    }然后你在点击下载的时候,首先要把此值赋为true;如果点击取消,把此值赋为false即可。
      

  4.   

    to 点击取消 是客户端点IE的下载提示框中的取消,代码能捕获这个事件?不能
      

  5.   

    很奇怪,客户端点取消后,服务端就在Response.IsClientConnected这里死掉了
      

  6.   

    好像可以了。用了一种很笨的方法。
    把下载部分的代码写到一个Timer中去执行,每读一块,写一下标记,主线程每隔1秒区判断一个标记,连续20次标记不正确(20秒)则退出并释放资源。
    但这个方法有一个问题,如果客户端的下载提示框弹出后,不点下载或打开等任何按钮,20秒后也会重置。另外,不知道网速很慢的情况下会不会有影响。