题
我有一个简单的asmx Web服务,只需要将一些信息记录到事务数据库中。然而,它是为客户提供的。更新数据库的调用只调用了1个存储过程,我不相信它可以进一步优化以获得更好的性能。我已经简化为只使用log4net记录运行,然后通过更新数据库的单独进程读取登录。
我想知道是否有更好的方法来做到这一点。我想知道是否有办法让我的代码做类似的事情:
public bool method(...)
{
LogRun(...)
Asynchronously call method to insert transaction
return true;
}
解决方案
编辑:我对BackgroundWorker的看法不对。所以我把它变成了Thread版本,经过测试。
如果您希望异步完成工作,可以学习如何启动另一个线程。
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
public void Log(int foo, int bar)
{
Thread a = new Thread(new ThreadStart(delegate()
{
// Do some processing here
// For example, let it sleep for 10 secs
Thread.Sleep(10000);
}));
a.Start();
}
}
如果Thread.Sleep(10000)行在Log方法本身中,则Log方法需要10秒才能完成处理。但是,使用 Thread a ,Log方法将在调用后立即返回。
另请注意,使用这种异步调用方式,如果插入操作完成与否,则没有简单的方法来保证调用客户端。
其他提示
您可能想要尝试的一件事是跟踪。
如果查询无法再进一步优化,可以增加 SQL客户端的超时值假设您可能正在使用SQL服务器。
在使用Web服务的客户端上,如果您希望客户端继续执行其他操作,则可以异步使用该方法。当web方法完成时,它将触发一个事件。有一个很好的小例子你可以在这里阅读如果你认为它可能有帮助。
虽然您可以在webmethod中查看异步操作,但是您正在使用asp.net中的线程和/或线程池,它已经在进行多线程操作。虽然技术上可行,但您也可能无意中抢夺资源系统,因为httpruntime管理资源以便为您的服务提供服务。
写入本地log4net文件并在脱机例程中导入该数据比实时日志记录,异步或其他方式具有更高的可用性,因为您的SQL Server可以脱机并且您的服务仍然可用。如果除了日志记录之外不需要sql server,则更喜欢将db操作保留在web方法之外。
如果它只是对客户端的即时消息,您的Web服务可能只是将详细信息添加到队列并返回到客户端。我已经使用MSMQ来实现类似于你所描述的内容。它不会修复数据库超时,但它确实会从客户端发送错误消息。