不能够更新UI后背景下的任务完成我的ASP.NET 应用程序

0

的问题

我正在运行一个长期运行的功能作为背景,在我的任务asp.net 应用程序。 之前完成任务的主线退出(我希望这种方式只能,因为如果我使用的等待着关键词以及使主线等背景任务完成,我得到代理的错误消息

代理的错误
代理服务器收到一个无效的响应,从上游服务器由于背景的任务是太长

但是一次之后完成的任务既不是我能刷新网页的重新定向到同一个网页或者两者都不是我能够复盖的用户界面。 是否有任何方式来更新UI后主线,完成了执行。

我的代码如下:

protected void btnImport_Click(object sender, EventArgs e)
{
        var task = ImportThread();

        if (task.IsCompleted)
        {
            DisplaySuccess("Import success");
        }
        else
            DisplayError("Import failed");
}

private async Task<bool> ImportThread()
{
        try
        {
            var success = await Task<bool>.Run(() => new Manager().Import().ConfigureAwait(false);

            if (task.IsCompleted)
            {
                DisplaySuccess("Import success");
            }
            else 
            {
                DisplayError("Import failed");
            }
    
            return true;
}

上述异步的任务等待着下面的方法,它存在于另一类。

public bool Import()
{
    // some operations here
    return true;
}

在此之后的方法完成的控制返回的背 ImportThread() 但编写的代码没有复盖UI是没有更新的用户界面。 我需要更新的用户界面与所述状况的进口。 还从 ImportThread 控制不打算回到按钮击事件的方法。

请帮助我的任何方式来更新UI状况的进口。

注:我试图使用 Redirect.ResponseImportThread() 刷新的网页,但没有工作

asp.net async-await background-task c#
2021-11-23 19:55:22
2

最好的答案

1

你的问题是,你有掌握和下站的网页生命周期在这里。

你有这种情况在其网页是坐在用户桌面:

enter image description here

现在说这个用户点击按钮。

你现在有这样的:

 var task = ImportThread();

    if (task.IsCompleted)

Ok,使该网页的服务器。 你可以把即使是异步的等待,直到母牛回家,但你还是这样的:

enter image description here

所以,只要你的代码运行,或者等待,网页仍然停留在服务器上面。 直到代码完成并退出不页旅行到客户的侧面。

再次: 你的代码不能停止,无法等待的东西完成,因为如果是这样,然后在页面保持在服务器,直到处理完毕。

然后然后才会网页使旅行回到了客户的侧面。 这个然后发生;

enter image description here

然后服务侧页扔出去的记忆和所有类变量是破坏!!! 网络服务器现在正在等待任何用户回发一个网页,用于处理!!

所以,如果你需要运行一种长期运行的过程?

你有几个选择:

员额的页码后面运行,代码后面开始一个新的线、网页,使得旅行回来。 在这一点上,你需要一个计时器+某些类型的网络方法的呼吁(阿贾克斯)为调查或询问如果服务器的长期运行的过程已经完成。 并由于阿贾克斯呼没有使用任何网的控制,在该网页上,或者页类变量(记得,在网页行下回到客户方面,该网页是不是不是现有的网络服务器方在存储器,也不是任何这类变量现有的). 因此,再一次,这相当多,意味着某种计时器,或者如所指出的,一个定时器+码呼吁一些阿贾克斯的方法。 和那个长期运行的过程将很有可能使用会议()由于你没有使用的控制,或甚至视图状态中。

和你没必要必须使用阿贾克斯的电话。 你可以使用一个简单的JavaScript客户端程序有一个计时器,说点击按钮每1或2秒钟,代码后面运行,它就必须得到的状态,长期运行的流程(再可能从届会议)和随后的更新所显示。 然后你还可以包括代码停止计时器时的状况已改为"完成"或什么的。

所以码在背后,不会"更新"的网页多次。 你有一个往返行程,后面的代码必须快速运行,必须完成运行,甚至不能使用待命令,此后,该网页将延续等待,并且仍然被困在服务器上。

如果你想要超越简单的计时器欺骗的方法-我经常使用?

然后你需要采用和引入到你的网站设计的东西对于这种类型的案例

值得庆幸的是,有访为此目的,毫无疑问最好的选择和方法,因为它是专为正是你的问题和情况。

访

https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/introduction-to-signalr#:~:text=What%20is%20SignalR%3F%20ASP.NET%20SignalR%20is%20a%20library,process%20of%20adding%20real-time%20web%20functionality%20to%20applications.

2021-11-23 21:28:35
0

如果你想要异步通知用户(完成败的任何诸如任务),可以使用网络推动通知(使用火力地堡的消息云)或访插座。 当您用一个背景任务你失去了主线和不幸的是,有没有办法来应对相关的用户。

2021-11-23 20:31:11

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................