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(); ,然后调试器失去控制,系统变得无响应。我发现旧的解决方案不使用的功率async
和await。
问题是如何制作我的 WebMethod Function asyc。
谢谢
在使用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)
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |