【发布时间】:2022-01-02 07:27:40
【问题描述】:
我在我的 asp.net 应用程序中运行一个长时间运行的函数作为后台任务。在任务完成之前,主线程退出(我只希望这样,因为如果我使用 await 关键字并使主线程等待后台任务完成,我会收到带有消息的代理错误
代理错误
由于后台任务太长,代理服务器收到来自上游服务器的无效响应
但是一旦任务完成后,我既不能通过重定向到同一页面来刷新页面,也不能覆盖 UI。主线程执行完成后有什么方法可以更新 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 的代码不会更新 UI。我需要使用导入状态更新 UI。而且来自ImportThread 的控件也不会返回到按钮单击事件方法。
请帮助我以任何方式更新 UI 导入状态。
注意:我尝试在ImportThread() 中使用Redirect.Response 来刷新页面,但这不起作用
【问题讨论】:
-
这永远不会奏效,因为您缺少关键的理解。您正在创建一个后台线程,当它完成时,已经没有 HttpRequest 了!您无法重定向用户或更新任何内容,原因很简单,即没有用户。
标签: c# asp.net async-await task-parallel-library background-task