通过PageMethods从javascript aspx页面调用时,C#死锁中的异步函数

问题摘要:

我正在尝试使用PageMethods从HTML页面调用C#函数。问题是我正在调用的C#函数被标记为异步,并且将等待其他函数的完成。当PageMethods调用嵌套的异步C#函数时,C#代码似乎死锁了。

我已经给出了一个示例ASP.NET页面,其后编码有C#,以说明我要使用的惯用法。


示例WebForm1.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication3.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head><title></title></head>

<body>

    <form id="form1" runat="server">

        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"/>

        <div>

            <input type="button" value="Show Function timing" onclick="GetTiming()"/>

        </div>

    </form>

</body>


<script type="text/javascript">

    function GetTiming() {

        console.log("GetTiming function started.");

        PageMethods.GetFunctionTiming(

            function (response, userContext, methodName) { window.alert(response.Result); }

        );

        console.log("GetTiming function ended."); // This line gets hit!

    }

</script>


</html>

示例WebForm1.aspx.cs


using System;

using System.Threading.Tasks;

using System.Diagnostics;

using System.Web.Services;

using System.Web.UI;

namespace WebApplication3

{

    public partial class WebForm1 : Page

    {

        protected void Page_Load(object sender, EventArgs e) { }

        [WebMethod]

        public static async Task<string> GetFunctionTiming()

        {

            string returnString = "Start time: " + DateTime.Now.ToString();

            Debug.WriteLine("Calling to business logic.");


            await Task.Delay(1000); // This seems to deadlock

            // Task.Delay(1000).Wait(); // This idiom would work if uncommented.


            Debug.WriteLine("Business logic completed."); // This line doesn't get hit if we await the Task!

            return returnString + "\nEnd time: "+ DateTime.Now.ToString();

        }

    }

}

问题:

我绝对需要能够从我的网页UI调用异步代码。我想使用异步/等待功能来做到这一点,但我一直无法弄清楚该怎么做。我目前正在通过使用Task.Wait()和Task.Result代替异步/等待来解决此不足,但这显然不是推荐的长期解决方案。

如何在PageMethods调用的上下文中等待服务器端异步功能???

我真的非常想了解这里的内容,为什么从控制台应用程序调用async方法时却不会发生。


哆啦的时光机
浏览 165回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP