我已经尝试阅读了异步方法,现在正尝试创建自己的异步方法。该方法是返回错误日志列表的webservice调用。我不确定我是否理解正确,所以我想我应该分享我的代码,看看我是否应该做些不同的事情。
所有我想要的代码做的是返回一个错误日志列表通过调用方法GetAllErrorLogs(),这是一个同步的方法。因为获取所有错误日志可能需要一秒钟的时间,所以我希望在调用GetAllErrorLogs()方法后有机会做其他事情。这是代码。
[WebMethod]
public async Task<List<ErrorLog>> GetAllErrorLogs()
{
List<ErrorLog> errorLogs = new List<ErrorLog>();
await System.Threading.Tasks.Task.Run(() => {
errorLogs = ErrorLogRepository.GetAllErrorLogs();
});
if (errorLogs == null)
return new List<ErrorLog>();
return errorLogs;
}
谢谢!
**这可能是错误的,请阅读HttpContext上的评论或衍生问题。等待后的电流
如果ErrorLogRepository。GetAllErrorLogs()
不是线程安全的,它会导致奇怪的错误,并可能导致异常。在切换到异步方法之前,请确保您的代码已准备好进行多线程操作,这显然是一个非常琐碎的建议,但常常被忽略。例如,如果您引用HttpContext。当前
在您的方法中,您的代码将在异步方法中消亡,有时甚至在等待
之后。原因是异步块中的代码可能会在单独的线程上运行,而该线程将无法访问相同的HttpContext。当前
thread静态属性和await
被编译成两个方法。在一个线程上运行await
之前的所有代码,然后在await关键字之后调用代码作为继续,但可能在另一个线程上。因此,有时您的代码甚至会在异步块中工作,只是在它“脱离”异步回到您认为是代码的同步部分后意外阻塞(但实际上,wait
关键字之后的所有内容都不能保证是原始线程)。
我发现这个伟大的代码项目详细的文章关于如何实现这一点
http://www.codeproject.com/Articles/600926/Asynchronous-web-services-call-in-ASP-NET
我最近在那次会议上做了一个关于服务器端的async
的演讲,我在幻灯片中讨论了这个问题。
在服务器端,您希望避免使用任务。运行
和将工作排入线程池的其他构造。尽可能保持线程池线程可用于处理请求。
因此,理想情况下,您的html" target="_blank">存储库将有一个异步方法GetAllErrorLogsAsync
,它本身是异步的。如果GetAllErrorLogs不能是异步的,那么你也可以直接调用它(删除等待任务的)。运行
)。
因为获取所有错误日志可能需要一秒钟的时间,所以我希望在调用GetAllErrorLogs()方法后有机会做其他事情。
如果你有一个GetAllErrorLogsAsync
可用,那么这可以很容易地完成使用任务。WhenAll
.但是,如果GetAllErrorLogs
是同步的,那么您只能通过在请求中执行并行工作来实现这一点(例如,多次调用任务。运行
后跟任务。WhenAll
)。
服务器上的并行代码必须以极大的恐惧来处理。这仅在非常有限的一组场景中是可以接受的。服务器端的async
的全部要点是每个请求使用较少的线程,而当您开始并行化时,您的做法正好相反:每个请求使用多个线程。只有当你知道你的用户群很小时,这才是合适的;否则,您将破坏服务器的可伸缩性。
假设代码块按需加载模块,如下所示: 想象一下,序列中有几个这样的人;它们在搜索什么标记/类、加载什么模块以及初始化过程中的一些额外步骤方面有所不同,但总体上它们是相同的,并且是独立的。 现在假设您需要引入一个可能依赖于其他模块的新块。i. e. 加载模块魔术表。js如果存在div.magic-table 加载模块魔法表单。js如果存在div.magic-form 加载模块魔术段落。如果p.magi
在前面几篇文章中都是使用同步方式来调用WebService。也就是说,如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止。使用同步方法来调用WebService虽然很直观,但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这样用户是无法忍受的。 当然我们很容易就可以想到解决问题的方法,这就是多线程。解决问题的基
本文向大家介绍AJAX创建异步对象XMLHttpRequest有哪些步骤?相关面试题,主要包含被问及AJAX创建异步对象XMLHttpRequest有哪些步骤?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: AJAX创建异步对象XMLHttpRequest 操作XMLHttpRequest 对象 (1)设置请求参数(请求方式,请求页面的相对路径,是否异步) (2)设置回调函数,一个处理服务
问题内容: 更新 :Intellij IDEA的最新版本完全实现了我想要的功能。问题是如何在IDE外部实现此功能(以便我可以将异步堆栈跟踪信息转储到日志文件中),理想情况下无需使用检测代理。 自从我将应用程序从同步模型转换为异步模型以来,调试故障一直遇到问题。 当我使用同步API时,我总是在异常stacktraces中找到我的类,因此我知道从哪里开始寻找问题。使用异步API,我得到的堆栈跟踪既不引
本文向大家介绍vs2019创建WebService服务的实现,包括了vs2019创建WebService服务的实现的使用技巧和注意事项,需要的朋友参考一下 WebService是一种远程调用技术,也叫XML Web Service WebService,是一种可以接收从Internet或者Internet上的其他系统中传递过来的请求,轻量级的独立的通信技术。是通过SOAP在Web上提供的软件服务,