C# ASP.NET API请求没有';我不能成功完成
我创建了一个向用户发送消息的端点,但请求没有成功完成,在结束前的一段时间后被中止 这项服务通常至少需要两个小时才能完成 下面是我使用task.run在后台运行它的代码C# ASP.NET API请求没有';我不能成功完成,c#,asp.net,api,web-services,async-await,C#,Asp.net,Api,Web Services,Async Await,我创建了一个向用户发送消息的端点,但请求没有成功完成,在结束前的一段时间后被中止 这项服务通常至少需要两个小时才能完成 下面是我使用task.run在后台运行它的代码 var task = Task.Run(() => new MessageManger().Send(message)); return View(new messageDTO()); 如果您必须使用任务,您可以尝试采用此方法,请注意最后3个参数,它们可能不适合您的要求 Task.Factory.StartNew(
var task = Task.Run(() => new MessageManger().Send(message));
return View(new messageDTO());
如果您必须使用任务,您可以尝试采用此方法,请注意最后3个参数,它们可能不适合您的要求
Task.Factory.StartNew(
() =>
WriteMessageInBackground(invoicesIn.Split(','), _messageController, chkSms.Checked,
chkEmail.Checked, messageTemplate),
CancellationToken.None,
TaskCreationOptions.PreferFairness,
TaskScheduler.Default);
它会立即返回,但重要的是要理解,WriteMessageInBackground方法只是将消息批量写入一个表中,我们还有另一个组件正在接收消息以进行发送,因为邮件服务器特别喜欢在几天内占用自己该死的时间。
正如在评论中提到的,如果这项工作真的很长时间运行,那么它确实需要交给网站以外的其他机构来运行 因此,您正在启动一个后台线程,它需要约2小时才能完成,但尚未完成 可能会发生一些事情:
我赌2英镑。可以,但是ASP.NET并不是为长时间运行的后台任务而设计的。您仍然有理由手动回收应用程序池,并且您不知道后台任务是否仍在运行。您最好将作业放在数据库的队列中,然后使用Windows服务提取并处理这些作业。这些代码不足以让我们知道发生了什么。您正在进行一场火灾,忘记了可能是您想要的,但请求在任务有机会运行之前结束。我只想同步发送消息,不管怎样在asp.net中运行Task.Run()都是不好的做法。请求可能需要2个小时才能结束,用户不会等待2个小时才能看到发生了什么。您不能从这样的请求在asp.net中运行长时间运行的进程。这听起来像是应该卸载到分布式系统。你们可能会看到类似于HangFire的东西,但对我来说,这是一个骇人听闻的问题。谢谢你们在搜索后帮助我。我已经安排了一份关于singleton设计模式的背景工作,效果很好@Crowcoder您是对的,因为不建议在asp.net中运行长进程,特别是当它与http请求有关时。我仍然不建议使用另一个线程池线程只是将消息放到队列或其他任何东西上。这应该是一个非常快速的操作,不需要异步。使用这种方法,您仍然有可能在写入邮件之前终止请求/响应。这是一个用户组合的列表,最多有9999个收件人,在完成所有操作时可能需要一到两分钟的时间。这个想法是页面立即返回,用户可以通过另一个页面查看页面进展情况。计划在某个阶段对此进行重构,但目前,这正是他们想要的。这就是目的。谢谢,这与上述解决方案中使用的.Net版本不兼容,因此这是另一天的工作(感谢大家在最后帮助我,我安排了一个使用singleton设计模式的后台工作,效果很好。是的,这是因为第二个请求应该花费2个多小时,所以IIS在结束前终止了此过程。感谢buddy的努力。