Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RegisterAsyncTask不';无法在ASP.Net Web窗体页中运行异步任务_Asp.net_Vb.net_Asynchronous_Webforms_Pageasynctask - Fatal编程技术网

RegisterAsyncTask不';无法在ASP.Net Web窗体页中运行异步任务

RegisterAsyncTask不';无法在ASP.Net Web窗体页中运行异步任务,asp.net,vb.net,asynchronous,webforms,pageasynctask,Asp.net,Vb.net,Asynchronous,Webforms,Pageasynctask,我在ASP.NETWeb表单应用程序中有一个登录页。成功登录后,它会执行一些耗时的数据库操作,这会减慢登录过程,因此我希望异步运行这些操作 我正在尝试使用RegisterAsyncTask等以推荐的方式来实现这一点。我在aspx文件中设置了@Page Async=“true”,并在aspx.vb文件中实现了以下代码(缩减以显示基本元素): 但是,DoExpensiveDbCheck函数从未运行(函数开头的断点从未命中),并且从未设置会话(“DbValueForUseLater”) 我想它可能不会

我在ASP.NETWeb表单应用程序中有一个登录页。成功登录后,它会执行一些耗时的数据库操作,这会减慢登录过程,因此我希望异步运行这些操作

我正在尝试使用RegisterAsyncTask等以推荐的方式来实现这一点。我在aspx文件中设置了@Page Async=“true”,并在aspx.vb文件中实现了以下代码(缩减以显示基本元素):

但是,DoExpensiveDbCheck函数从未运行(函数开头的断点从未命中),并且从未设置会话(“DbValueForUseLater”)

我想它可能不会运行,因为登录函数通过重定向到应用程序的主页来完成,所以我添加了page.ExecuteRegisteredAsyncTasks(),以防万一,但这没有什么区别

有趣的是,如果我为DoExpensiveDbCheck而不是使用RegisterAsyncTask创建一个任务,并对此任务执行等待,那么应用程序将完全冻结,并且DoExpensiveDbCheck中的断点永远不会命中


有人知道我在这里做错了什么吗?

我可能在这里做错了,但我很确定当页面结束并发送数据时,线程会被完全删除。你可以试试Hi@the_莲花。我需要它异步运行,但在页面生命周期的某个时间点运行,因为将来的页面可能需要引用会话(“DbValueForUseLater”)。似乎QueueBackgroundWorkItem在应用程序域关闭之前的任何时候都会对要运行的任务进行排队?您是否只运行一个异步任务?如果要并行运行多个异步任务以加快时间,则使用
PageAsyncTask
非常有用。如果我理解您的场景,那么它并不是真正的异步。它在启动异步任务后不会继续执行,因此如果它只是一个异步任务,那么您将看不到时间的改进。我认为运行一个的唯一好处是它释放了IIS处理其他请求的线程,而不是当前请求的线程。是的,我希望它能够异步运行DoLoginStuff()中的DoExpensiveDbCheck。所以我认为我需要将DoLoginStuff中的其余处理放在一个单独的异步方法中,并注册该方法以使它们异步运行?我可以试一下,但是DoExpensiveDbCheck方法仍然存在一个问题,根本没有运行过。是的,你可以尝试一下,但是我对async非常不熟悉,所以我所知道的不比我提到的多。至于这个问题,我不知道为什么,但是调用ExecuterRegisteredAsyncTasks似乎对代码没有影响。但是,它会像预期的那样在PreRenderComplete事件之前自动调用,这解释了为什么它从未运行,因为我假设您的重定向在此之前发生。如果你注释掉你的重定向,你应该会看到它最终会被执行。我在这里可能错了,但我很确定当页面结束并发送数据时,线程会被完全删除。你可以试试Hi@the_莲花。我需要它异步运行,但在页面生命周期的某个时间点运行,因为将来的页面可能需要引用会话(“DbValueForUseLater”)。似乎QueueBackgroundWorkItem在应用程序域关闭之前的任何时候都会对要运行的任务进行排队?您是否只运行一个异步任务?如果要并行运行多个异步任务以加快时间,则使用
PageAsyncTask
非常有用。如果我理解您的场景,那么它并不是真正的异步。它在启动异步任务后不会继续执行,因此如果它只是一个异步任务,那么您将看不到时间的改进。我认为运行一个的唯一好处是它释放了IIS处理其他请求的线程,而不是当前请求的线程。是的,我希望它能够异步运行DoLoginStuff()中的DoExpensiveDbCheck。所以我认为我需要将DoLoginStuff中的其余处理放在一个单独的异步方法中,并注册该方法以使它们异步运行?我可以试一下,但是DoExpensiveDbCheck方法仍然存在一个问题,根本没有运行过。是的,你可以尝试一下,但是我对async非常不熟悉,所以我所知道的不比我提到的多。至于这个问题,我不知道为什么,但是调用ExecuterRegisteredAsyncTasks似乎对代码没有影响。但是,它会像预期的那样在PreRenderComplete事件之前自动调用,这解释了为什么它从未运行,因为我假设您的重定向在此之前发生。如果你注释掉你的重定向,你应该看到它最终会被执行。
       Protected Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click

            If LoginSuccessful() Then
               DoLoginStuff()
            End If

        End Sub

        Private Sub DoLoginStuff()
            ...
            RegisterAsyncTask(New PageAsyncTask(Function() DoExpensiveDbCheck(userKey)))
            Page.ExecuteRegisteredAsyncTasks()
            ...
        End Sub

        Private Async Function DoExpensiveDbCheck(ByVal UserKey As Integer) As Task
           ...
           response = Await Task.Run(Function() DbService.DoCheck(UserKey))
           If response.Success AndAlso response.Items.Count() = 1 Then
               Session("DbValueForUseLater") = response.Item[0].Whatever
           End If
        End Function