我有一个运行背景生成和图像的任务。 当我将图像放在服务器上时,我想转到显示图像的页面。
我无法做到这一点,我希望由于缺乏对asp.net core v.2.0中剃刀页面的了解而
基本上我有我的页面:
<div>
<img src="images/IAmGeneratingAnImage.png"/>
</div>
我的模特:
class xx:PageModel ...
public void OnGet() {
Task.Factory.StartNew(() => { CheckForImageAndRedirect(); });
}
private void CheckForImageAndRedirect() {
string fileNameFull = "";
do
{
var file = new FileInfo("C:\...\imageName.png");
if (file.Exists ))
fileNameFull = file.FullName;
Thread.Sleep(1000);
}
while (String.IsNullOrEmpty(fileNameFull));
RedirectToPage("OtherPageThatDisplaysImage"); // razorpage also.
}
我真的想将路径传递给新页面,这也许可以做到......
所以这些是我的两个问题:
a)如何在任务完成后重定向到页面?
b)如何将新的imagepath传递给新页面?
或者我是否完全错误地解决了这个问题?
答案 0 :(得分:1)
我认为你的主要问题在于使用Task.Factory.StartNew
。通常,在Web应用程序中,这不仅是一件坏事,而且当您这样做时,正在运行的代码将被转移到新的线程中。这就是重点,但结果是你的应用程序继续运行,当你的方法最终想要重定向时,没有什么可以重定向:响应已经被返回或是太远了改变它。更重要的是,此处运行的代码现在甚至无法访问响应以更改它,因为它没有在相同的线程上下文中运行。
如果你想在后台做某事&#34;&#34;,你需要将它卸载到实际的后台进程,而不是新线程。您可以使用HangFire或类似工具来完成此任务。然后,继续前进并将响应返回给用户,并使用SignalR或通过AJAX进行长轮询来检查后台作业的状态。完成作业后,您可以适当地重定向用户,但这需要发生在客户端,而不是服务器端。服务器返回响应后,即可完成。如果没有先从客户端收到新请求,它就无法发出重定向。
最后,虽然与此处的问题无关,但请注意Thread.Sleep
正在阻止。您应该使用Task.Sleep
代替。