我有一个简单的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来实现类似于你所描述的内容。它不会修复数据库超时,但它确实会从客户端发送错误消息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top