0

我有一个任务正在运行背景生成和图像。当我将图像放在服务器上时,我想转到显示图像的页面。

我在这样做时遇到了麻烦,我预计是由于缺乏对 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)如何将新的图像路径传递给新页面?

还是我完全错误地附加了问题?

4

1 回答 1

1

我认为您的主要问题在于使用Task.Factory.StartNew. 一般来说,在 Web 应用程序中这样做不仅是一件坏事,而且当你这样做时,正在运行的代码会被转移到一个新线程中。这就是重点,但结果是您的应用程序继续前进,当您的方法最终想要重定向时,没有任何东西可以重定向:响应已经返回或者太远而无法更改它。更重要的是,现在在这里运行的代码甚至无法访问响应来更改它,因为它没有在同一个线程上下文中运行。

如果您想“在后台”做某事,您需要将其卸载到实际的后台进程,而不是新线程。您可以使用 HangFire 或类似工具来完成此操作。然后继续向用户返回响应,并使用 SignalR 或通过 AJAX 进行长轮询来检查后台作业的状态。一旦你的工作完成,那么你可以适当地重定向用户,但这需要发生在客户端,而不是服务器端。一旦服务器返回响应,它就完成了。如果不先从客户端接收到新请求,它就无法发出重定向。

最后,虽然与这里手头的问题无关,但请注意这Thread.Sleep是阻塞。你应该Task.Sleep改用。

于 2017-11-15T12:30:16.070 回答