我正在使用具有 DoLookup() 函数的 C# 编写 ASP.NET Web 服务。对于对 DoLookup() 函数的每次调用,我需要我的代码执行两个单独的查询:一个是对远程站点上的另一个 Web 服务,一个是对本地数据库。这两个查询都必须完成,然后我才能编译结果并将它们作为对 DoLookup 方法的响应返回。我正在处理的问题是,我希望在响应时间和 Web 服务器上的资源使用方面尽可能高效。我们预计每小时会有数千次查询。这是我目前所掌握的类似 C# 的粗略概述:
public class SomeService : System.Web.Services.WebService
{
public SomeResponse DoLookup()
{
// Do the lookup at the remote web service and get the response
WebResponse wr = RemoteProvider.DoRemoteLookup();
// Do the lookup at the local database and get the response
DBResponse dbr = DoDatabaseLookup();
SomeResponse resp = new SomeResponse( wr, dbr);
return resp;
}
}
上面的代码按顺序执行所有操作并且效果很好,但现在我想让它更具可扩展性。我知道我可以异步调用 DoRemoteLookup() 函数(RemoteProvider 具有 BeginRemoteLookup/EndRemoteLookup 方法)并且我还可以使用 BeginExecuteNonQuery/EndExecuteNonQuery 方法异步进行数据库查找。
我的问题(最后)是:如何在不同的线程上同时触发远程 Web 服务查找和数据库查找,并确保它们在返回响应之前都已完成?
我想在不同的线程上执行这两个请求的原因是它们都可能有很长的响应时间(1 或 2 秒),我想释放 Web 服务器的资源来处理其他请求等待回应。附加说明 - 我目前确实有异步运行的远程 Web 服务查找,我只是不想让上面的示例太困惑。我正在努力解决的问题是同时启动远程服务查找和数据库查找,并确定它们何时完成。
感谢您的任何建议。
最佳答案
您可以使用一对 AutoResetEvents
,每个线程一个。在线程执行结束时,调用 AutoResetEvents.Set()
来触发事件。
生成线程后,您将 WaitAll()
与两个 AutoResetEvent 一起使用。这将导致线程阻塞,直到设置两个事件。
这种方法的警告是您必须确保 Set() 保证被调用,否则您将永远阻塞。此外,请确保使用线程执行正确的异常处理,否则当未处理的异常导致您的 Web 应用程序重新启动时,您将无意中导致更多性能问题。
关于c# - 使用多个长时间运行的操作优化 ASMX Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1407772/