问题摘要:
我正在尝试使用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方法时却不会发生。
相关分类