用户要批量上传文件
上传后每个文件要经过处理
每个文件的处理时间可能有些长,大概10秒-几分钟
批量上传的时候不能让人等着呀
所以想用户上传后,就转为后台处理,用户可关闭浏览器
并且这个处理不能所有文件同时进行,否则资源占用率太高会死机
文件处理是用Process进行的,也就是说不能创建超过一个进程
第一个文件处理完毕,再处理第二个,处理状态在数据库中存放那么这个功能怎么实现?用Timer?这个Timer在用户关闭浏览器后还会执行知道条件满足吗?
或者用web services?这个了解比较少,不知道能实现不
还是编写一个Windows Service?
请大家指教

解决方案 »

  1.   

    用户上传文件后将文件信息存入一个队列,后台从队列中取出一个进行处理,处理完后再取下一个,直到队列空。文件信息也可以存入数据表里,处理完后从表中删除。
    这种功能感觉用Windows Service实现比较好~
      

  2.   

    嗯,上传文件信息存到数据库里
    是否处理过的状态也存在数据库就行,并且需求上应该不用删除然后从数据库取出没处理过的文件,也就是跟你说的队列差不多了不过Windows Service没做过呀,一直做asp.net了
    不知道能不能实现
      

  3.   

    private void ProcessFile(string[] files) {
     // 这里是上传的文件处理代码
    }// 将处理文件的任务排队,交给其它线程处理
    object state = new string[]{"file1","file2"};
    System.Threading.ThreadPool.QueueUserWorkItem(ProcessFile, state);
      

  4.   

    有一个FLASH来上传文件的项目 的,我感觉它比较符合你的需求。你可以在网上找一下。
      

  5.   

    基于纯Web没有太好的解决办法,可以考虑为这个功能提供一个客户端工具给用户,土豆上传大量视频都是这样做的。
      

  6.   

    唉......最近花了600分问了4个问题,没有一个有人提出建设性意见的
    入门的时候csdn帮助好大的
    提高的时候了,感觉就不太行了,都喜欢跑去答简单分高的
      

  7.   

    离线?
    单击按钮跳转到清除Session的页面,该页面redirect某页面
      

  8.   

    反正也是闲着,我再写详细点// 用户单击上传按钮的事件处理代码
    proptected void BtnSubmit_Click(object sender, EventArgs e) {
      // 读取上传的文件
      HttpPostedFile file = Request.Files[0];
      // 保存上传的文件到服务器
      file.SaveAs("c:\somefile.ext");
      // 文件保存成功,主线程结束,客户端可以关闭。
      messageBox.Show("文件上传成功,正在处理您的文件"); // 通知客户端。
      // 下面的代码将处理这个上传的文件
      // 即使处理需要很长的时间,也不要求客户端保持连接。
      object state = new string[]{"c:\somefile.ext"};
      // 下面的代码将一个需要很长时间去执行的过程排队,
      // 等CPU空闲的时候再执行ProcessFile这个方法
      System.Threading.ThreadPool.QueueUserWorkItem(ProcessFile, state);
    }private void ProcessFile(string[] files) {
     // TODO:这里是上传的文件处理代码
    }
      

  9.   


    注意看回复,很多时候问题可能出在自己身上,有时间抱怨不如去看看
    ystem.Threading.ThreadPool.QueueUserWorkItem
    这个方法,
    如果想要进一步了解异步操作
    可以多去看看这方面的例子,有很多类:
    收IO操作限制的异步操作,受网络限制的异步操作,受CPU限制的异步操作。
      

  10.   

    web services 
    和多线程处理,具体要实验一下,不过思路不会错。而且人家也贴了些代码了,你看一下,主要是 System.Threading.ThreadPool.QueueUserWorkItem(ProcessFile, state);
    线程放在web services 里开。。