Описание проблемы:
Я пытаюсь использовать PageMethods для вызова функции C # со страницы HTML. Проблема в том, что вызываемая мной функция 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();
}
}
}
Вопрос:
Мне абсолютно необходимо иметь возможность вызывать асинхронный код из пользовательского интерфейса моей веб-страницы. Я хотел бы использовать функциональность async / await для этого, но я не смог понять, как это сделать. В настоящее время я работаю над этим дефицитом, используя Task.Wait()
и Task.Result
вместо async / await, но это явно не рекомендуемое долгосрочное решение.
Как мне ожидать асинхронных функций на стороне сервера в контексте вызова PageMethods ???
Я действительно очень хочу понять, ЧТО здесь происходит, и ПОЧЕМУ этого НЕ происходит, когда асинхронный метод вызывается из консольного приложения.