在反馈的线程中运行某些东西

时间:2010-11-23 05:24:43

标签: c# asp.net multithreading

我编写了一个函数,它收集了大量文件,将它们拉上来,然后允许用户通过asp.net网站下载此zip文件。

然而,这些zip文件会非常大(比如1GB大),所以它不会立即发生,我想做的是能够在单独的线程上运行(可能? )当用户继续浏览网站时,一旦创建了zip,就可以通过某种方式通知他们,然后他们就可以下载这个zip了。

我希望能有一些关于如何在c#和UI方面做到最好的指示。

提前致谢。

4 个答案:

答案 0 :(得分:2)

使用 Asynchronous Pages in ASP.NET 2.0

由于担心页面回收,会话过期,你不能在asp.net中等待太长时间来完成任务,你可以使用其他进程压缩这些文件并在数据库中更新标记,这样会很棒在私人网络的某个地方你的zip组件准备好了!!你的asp.net应用程序应该读取这个标志,而不是让用户知道他们的zip已准备好下载。

答案 1 :(得分:1)

您可以使用BackgroundWorker组件。它具有提升进度事件的能力,您可以使用该事件向主线程(如UI)提供反馈。

public void static Main()
{
    var bw = new BackgroundWorkder();
    bw.DoWork += _worker_DoWork;
    bw.RunWorkerCompleted += _worker_RunWorkerCompleted;
    bw.ProgressChanged += _worker_ProgressChanged;
    bw.WorkerReportsProgress = true;
    bw.WorkerSupportsCancellation = false;

    //START PROCESSING
    bw.RunWorkerAsync(/*PASS FILE DATA*/);
}

private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bw = sender as BackgroundWorker;
    var data = e.Argument as /*DATA OBJECT YOU PASSED*/;

    //PSEUDO CODE
    foreach(var file in FILES)
    {
        zipFile;
        //HERE YOU CAN REPORT PROGRESS
        bw.ReportProgress(/*int percentProgress, object userState*/)
    }
}

private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Just update progress bar with % complete or something
}

private void _worker_RunWorkerCompleted(object sender, 
                               RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        //...
    }
    else
    {
        //......
    }
}

答案 2 :(得分:0)

答案 3 :(得分:0)

BackgroundWorker对象可能就是您要找的对象。 这是一个很好的教程:http://dotnetperls.com/backgroundworker