为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
哆啦的时光机 2021-05-14 18:54:55
问题摘要:我正在尝试使用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.csusing 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方法时却不会发生。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信