C# 通过反馈在线程中运行某些内容

C# 通过反馈在线程中运行某些内容,c#,asp.net,multithreading,C#,Asp.net,Multithreading,我已经编写了一个函数,它接收一大堆文件,将它们压缩,然后允许用户通过asp.net网站下载这个zip文件 但是,这些zip文件将非常大(比如1GB),所以不会立即发生,我想做的是能够在单独的线程上运行(可能?),同时用户继续在网站上导航,一旦创建了zip,有一些通知他们的方法,这样他们就可以下载这个zip 我希望得到一些关于如何在c#和UI方面最好地做到这一点的建议 提前感谢。使用backgroundworker:backgroundworker对象可能就是您正在寻找的对象。 这里有一个很好的教

我已经编写了一个函数,它接收一大堆文件,将它们压缩,然后允许用户通过asp.net网站下载这个zip文件

但是,这些zip文件将非常大(比如1GB),所以不会立即发生,我想做的是能够在单独的线程上运行(可能?),同时用户继续在网站上导航,一旦创建了zip,有一些通知他们的方法,这样他们就可以下载这个zip

我希望得到一些关于如何在c#和UI方面最好地做到这一点的建议


提前感谢。

使用backgroundworker:

backgroundworker对象可能就是您正在寻找的对象。
这里有一个很好的教程:

您可以使用
BackgroundWorker
组件。它能够引发进度事件,您可以使用该事件向主线程(如UI)提供反馈

使用


您不能在asp.net中等待太长时间来完成任务,因为担心页面循环,会话过期,最好使用其他进程压缩这些文件,并在数据库或专用网络中的某个位置更新标志,表明zip组件已准备就绪!!您的asp.net应用程序应该阅读此标志,然后让用户知道他们的zip已准备好下载。

Brilliant,也感谢示例代码,我会试一试,但这是否意味着用户仍然可以在网站上导航,并且“worker\u RunWorkerCompleted”在某个时候仍然会启动?
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
    {
        //......
    }
}