我正在使用具有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()和两个AutoResetEvents。这将导致线程阻塞,直到设置了两个事件。

这种方法的警告是你必须确保调用Set(),否则你将永远阻止。另外,请确保使用线程执行正确的异常处理,否则当无法处理的异常导致Web应用程序重新启动时,您将无意中导致更多性能问题。

MSDN有关于AutoResetEvent使用的示例代码。

其他提示

假设您可以为Web请求和数据库查找提供回调函数,那么这些行中的某些内容可能会起作用

bool webLookupDone = false;
bool databaseLookupDone = false;

private void FinishedDBLookupCallBack()
{
    databaseLookupDone = true;
    if(webLookupDone)
    {
        FinishMethod();
    }
}

private void FinishedWebLookupCallBack()
{
    webLookupDone = true;
    if(databaseLookupDone)
    {
        FinishMethod();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top