Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net网页中执行繁重任务并报告进度_C#_Asp.net_Task Parallel Library - Fatal编程技术网

C# 在asp.net网页中执行繁重任务并报告进度

C# 在asp.net网页中执行繁重任务并报告进度,c#,asp.net,task-parallel-library,C#,Asp.net,Task Parallel Library,我有一个带有按钮的asp.net webforms页面,当单击该按钮时,会出现一个应执行的任务,我希望该任务异步执行,并将其进度报告到文件(可能稍后会报告到UI,但现在我们坚持使用该文件) ASPX: 代码隐藏: public partial class _Default : Page { public Progress<int> HeavyTaskProgress { get; set; } protected void Page_Load(object sen

我有一个带有按钮的asp.net webforms页面,当单击该按钮时,会出现一个应执行的
任务
,我希望该任务异步执行,并将其进度报告到
文件
(可能稍后会报告到UI,但现在我们坚持使用该文件)

ASPX:


代码隐藏:

public partial class _Default : Page
{
    public Progress<int> HeavyTaskProgress { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void BtnExecute_Click(object sender, EventArgs e)
    {
        HeavyTaskProgress = new Progress<int>();
        HeavyTaskProgress.ProgressChanged += Progress_ProgressChanged;
        Task.Run(() => DoProcessing(HeavyTaskProgress)).ContinueWith(t => ProcessingFinished(t));
        LblStatus.Text = "Task is launched.... Please wait";
    }
    private void Progress_ProgressChanged(object sender, int e)
    {
        string message = string.Format("progress at {0}%{1}", e, Environment.NewLine);
        System.IO.File.AppendAllText(@"d:\progress.txt", message);
    }
    private void DoProcessing(IProgress<int> progress)
    {
        for (int i = 0; i < 10; ++i)
        {
            Thread.Sleep(1000); // CPU-bound work
            if (progress != null)
                progress.Report(i);
        }
    }
    private void ProcessingFinished(Task t)
    {
        System.IO.File.AppendAllText(@"d:\progress.txt", "Task done !! " + t.Status);
    }
}
public分部类\u默认值:第页
{
公共进程HeavyTaskProgress{get;set;}
受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的无效BtnExecute\u单击(对象发送者,事件参数e)
{
HeavyTaskProgress=新进度();
HeavyTaskProgress.ProgressChanged+=进度\u ProgressChanged;
运行(()=>DoProcessing(HeavyTaskProgress)).ContinueWith(t=>ProcessingFinished(t));
LblStatus.Text=“任务已启动……请稍候”;
}
私有void Progress\u ProgressChanged(对象发送方,int e)
{
string message=string.Format(“在{0}%{1}的进度”,e,Environment.NewLine);
System.IO.File.AppendAllText(@“d:\progress.txt”,消息);
}
私有无效数据处理(IProgress progress)
{
对于(int i=0;i<10;++i)
{
Thread.Sleep(1000);//CPU绑定的工作
如果(进度!=null)
进度报告(一);
}
}
私有无效处理已完成(任务t)
{
System.IO.File.AppendAllText(@“d:\progress.txt”,“任务完成!!”+t.Status);
}
}
d:\progress.txt
文件中,我只有一行(任务完成了…),并且没有报告进度(在
progress\u ProgressChanged
中的断点没有中断)。我认为这可能是因为
ProgressChanged
DoProcessing
在不同的线程中执行,但我不知道如何修复它


感谢您的帮助。

我认为您的问题是,在引发事件时,处理HTTP请求的线程被终止。
归属于事件的对象位于呈现页面的线程中。HTTP应答发送回浏览器后,此线程即终止。因此,当引发事件时,不再有订户。
由于您必须在任务完成之前发送HTTP响应,除非用户必须等待任务完成才能获得反馈,因此您应该执行操作,将进度写入任务线程中的文件。
如果您希望定期向用户发送反馈,可以查看Signal。
以下是将编写进度代码嵌入任务的示例:

public class DoingProcessing
{
    public Progress<int> HeavyTaskProgress { get; set; }

    private void Progress_ProgressChanged(object sender, int e)
    {
        string message = string.Format("progress at {0}%{1}", e, Environment.NewLine);
        System.IO.File.AppendAllText(@"d:\progress.txt", message);
    }

    public void DoProcessing()
    {
        HeavyTaskProgress = new Progress<int>();
        HeavyTaskProgress.ProgressChanged += Progress_ProgressChanged;
        DoProcessing(HeavyTaskProgress);
    }
    private void DoProcessing(IProgress<int> progress)
    {
        for (int i = 1; i <= 10; ++i)
        {
            Thread.Sleep(1000); // CPU-bound work
            if (progress != null)
                progress.Report(i*10);
        }
    }

    public void ProcessingFinished(Task t)
    {
        System.IO.File.AppendAllText(@"d:\progress.txt", "Task done !! " + t.Status);
    }
    public DoingProcessing()
    {

    }
} 
公共类执行处理
{
公共进程HeavyTaskProgress{get;set;}
私有void Progress\u ProgressChanged(对象发送方,int e)
{
string message=string.Format(“在{0}%{1}的进度”,e,Environment.NewLine);
System.IO.File.AppendAllText(@“d:\progress.txt”,消息);
}
公共无效数据处理()
{
HeavyTaskProgress=新进度();
HeavyTaskProgress.ProgressChanged+=进度\u ProgressChanged;
数据处理(重任务进程);
}
私有无效数据处理(IProgress progress)
{
对于(int i=1;i
public class DoingProcessing
{
    public Progress<int> HeavyTaskProgress { get; set; }

    private void Progress_ProgressChanged(object sender, int e)
    {
        string message = string.Format("progress at {0}%{1}", e, Environment.NewLine);
        System.IO.File.AppendAllText(@"d:\progress.txt", message);
    }

    public void DoProcessing()
    {
        HeavyTaskProgress = new Progress<int>();
        HeavyTaskProgress.ProgressChanged += Progress_ProgressChanged;
        DoProcessing(HeavyTaskProgress);
    }
    private void DoProcessing(IProgress<int> progress)
    {
        for (int i = 1; i <= 10; ++i)
        {
            Thread.Sleep(1000); // CPU-bound work
            if (progress != null)
                progress.Report(i*10);
        }
    }

    public void ProcessingFinished(Task t)
    {
        System.IO.File.AppendAllText(@"d:\progress.txt", "Task done !! " + t.Status);
    }
    public DoingProcessing()
    {

    }
}