当前位置: 首页 > 知识库问答 >
问题:

创建异步webservice方法

松和泰
2023-03-14

我已经尝试阅读了异步方法,现在正尝试创建自己的异步方法。该方法是返回错误日志列表的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;
}

谢谢!

共有3个答案

庄文栋
2023-03-14

**这可能是错误的,请阅读HttpContext上的评论或衍生问题。等待后的电流

如果ErrorLogRepository。GetAllErrorLogs()不是线程安全的,它会导致奇怪的错误,并可能导致异常。在切换到异步方法之前,请确保您的代码已准备好进行多线程操作,这显然是一个非常琐碎的建议,但常常被忽略。例如,如果您引用HttpContext。当前在您的方法中,您的代码将在异步方法中消亡,有时甚至在等待之后。原因是异步块中的代码可能会在单独的线程上运行,而该线程将无法访问相同的HttpContext。当前thread静态属性和await被编译成两个方法。在一个线程上运行await之前的所有代码,然后在await关键字之后调用代码作为继续,但可能在另一个线程上。因此,有时您的代码甚至会在异步块中工作,只是在它“脱离”异步回到您认为是代码的同步部分后意外阻塞(但实际上,wait关键字之后的所有内容都不能保证是原始线程)。

易雅畅
2023-03-14

我发现这个伟大的代码项目详细的文章关于如何实现这一点

http://www.codeproject.com/Articles/600926/Asynchronous-web-services-call-in-ASP-NET

方祺
2023-03-14

我最近在那次会议上做了一个关于服务器端的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上提供的软件服务,