使 WebMethod 异步 Web 表单

JB'*_*B's 5 c# asp.net asynchronous webforms webmethod

我有大量的[WebMethod]整个应用程序,我希望我所有的[WebMethod]都是异步的。我[WebMethod]用 async 和 await 关键字装饰了我所有的签名,然后运行我的应用程序。它没有按预期进行。假设我有以下代码

背后的代码

[WebMethod]
public static async Task<List<XXX>> GetXXX()
{
    return await new BusinessLogic().GetXXX().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

业务层

    internal async Task<List<XXX>> GetXXX()
    {
        var obj = await objDAL.GetXXX().ConfigureAwait(false);
        List<XXX> listDO = new List<XXX>();
        foreach (var item in obj)
        {
            listDO.Add(new Countries
            {
                XXXName = item.name,
                XXXID = item.id
            });
        }
        return listDO;
Run Code Online (Sandbox Code Playgroud)

objDAL.GetXXX

    internal async Task<List<tblXXX>> GetXXX()
    {
        using (ABCEntities ctx = new ABCEntities())
        {
            return await ctx.tblXXX.ToListAsync().ConfigureAwait(false);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经将调试器放在上面代码到达的整个路径中return await ctx.tblXXX.ToListAsync(); ,然后调试器失去控制,系统变得无响应。我发现旧的解决方案不使用的功率asyncawait

问题是如何制作我的 WebMethod Function asyc

谢谢

Ste*_*ary 0

在使用async/之前await,您需要在 .NET Framework 4.5 或更高版本上运行, 设置httpRuntime.targetFramework为 4.5 或更高版本。如果您还无法升级到 .NET 4.5,那么就完全停止:您根本async无法使用或。await

然后,您可以使用标准的APM-over-TAP 包装器模式,如下所示:

private static async Task<List<XXX>> GetXXXAsync()
{
  return await new BusinessLogic().GetXXX().ConfigureAwait(false);
}

[WebMethod]
public IAsyncResult BeginGetXXX(AsyncCallback callback, object state)
{
  var tcs = new TaskCompletionSource<List<XXX>>(state);
  var task = GetXXXAsync(arg);
  ExtractResultWhenComplete();
  return tcs.Task;

  async void ExtractResultWhenComplete()
  {
    try { tcs.TrySetResult(await task); }
    catch (Exception ex) { tcs.TrySetException(ex); }
    callback?.Invoke(tcs.Task);
  }
}

[WebMethod]
public List<XXX> EndGetXXX(IAsyncResult result)
{
  return ((Task<List<XXX>>)result).GetAwaiter().GetResult();
}
Run Code Online (Sandbox Code Playgroud)