问题描述
我是从来。在.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.
这篇关于迟发型后台作业与返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!