本文介绍了迟发型后台作业与返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是从来。在.NET 4.5 + Task.Run 可以返回任务< TResult> ,让我来运行比返回其他任务无效。我通常可以等待和访问属性得到我的任务的结果 MyReturnedTask.Result

我的老code的例子:

 公共无效MyMain code()
{
    清单<串GT; listStr =新的List<串GT;();
    listStr.Add(鲍勃);
    listStr.Add(凯特);
    listStr.Add(雅致);    清单<任务<串GT;> listTasks =新的List<任务<串GT;>();    的foreach(在listStr字符串str)
    {
        任务<串GT; returnedTask = Task.Run(()=> GetMyString(STR));
        listTasks.Add(returnedTask);
    }    的foreach(任务<串>在listTasks任务)
    {
        //使用task.Result将导致code键等待的任务,如果还没有完成。
        //或者,您也可以使用Task.WaitAll(listTasks.ToArray())等待列表中的所有任务完成。
        MyTextBox.Text + = task.Result + Environment.NewLine;
    }
}
私人字符串GetMyString(字符串str)
{
    //执行长,以计算返回的字符串
    返回STR +_finished
}

我可以从页面看到迟发型,你的主要家伙是 BackgroundJob.Enqueue(()=> Console.WriteLine(发射后不管));
完美运行code作为后台作业,但显然不支持有返回值(如上面的psented code我$ P $)的工作。是对的吗?如果没有,我怎么能调整我的code才能使用迟发型?

P.S。我已经看了 HostingEnvironment.QueueBackgroundWorkItem (这里),但它显然缺乏相同的功能(后台作业必须是无效

修改

由于@Dejan想通了,主要的原因我想切换到迟发型的道理是一样的.NET乡亲加入 QueueBackgroundWorkItem 在.NET 4.5.2。而这原因是有关在ASP.NET中后台任务斯科特Hanselman的伟大很好的描述。所以我要引述的文章:

解决方案

One simple solution would be to poll the monitoring API until the job is finished like this:

    public static Task Enqueue(Expression<Action> methodCall)
    {
        string jobId = BackgroundJob.Enqueue(methodCall);
        Task checkJobState = Task.Factory.StartNew(() =>
        {
            while (true)
            {
                IMonitoringApi monitoringApi = JobStorage.Current.GetMonitoringApi();
                JobDetailsDto jobDetails = monitoringApi.JobDetails(jobId);
                string currentState = jobDetails.History[0].StateName;
                if (currentState != "Enqueued" && currentState != "Processing")
                {
                    break;
                }
                Thread.Sleep(100); // adjust to a coarse enough value for your scenario
            }
        });
        return checkJobState;
    }

Attention: Of course, in a Web-hosted scenario you cannot rely on continuation of the task (task.ContinueWith()) to do more things after the job has finished as the AppDomain might be shut down - for the same reasons you probably want to use Hangfire in the first place.

这篇关于迟发型后台作业与返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-16 12:20