问题摘要:我正在尝试使用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
提交
取消