1

我有一个简单的 asmx Web 服务,只需要将一些信息记录到事务数据库中。但是,它对客户端来说是超时的。更新数据库的调用只调用了 1 个存储过程,我不相信它可以进一步优化以获得更好的性能。我已经简化为只使用 log4net 记录运行,然后通过更新数据库的单独进程读取日志。

我想知道是否有更好的方法来做到这一点。我想知道是否有办法让我的代码执行以下操作:

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}
4

5 回答 5

0

您可能想尝试的一件事是Tracing

于 2008-12-30T14:43:15.053 回答
0

编辑:我错了 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 方法将在调用后立即返回。

另请注意,使用这种异步调用方式,没有简单的方法可以保证调用客户端是否完成插入操作。

于 2008-12-30T14:54:31.087 回答
0

如果查询无法进一步优化,您可以增加SQL 客户端的超时值,假设您可能正在使用 SQL 服务器。

在使用 Web 服务的客户端,如果您希望客户端继续执行其他操作,可以异步使用该方法。当 web 方法完成时,它将触发一个事件。如果您认为它可能有帮助,您可以在此处阅读一个不错的小示例。

于 2008-12-30T15:07:48.343 回答
0

虽然您可以查看在 web 方法中执行异步操作,但您正在使用 asp.net 中的线程和/或线程池,它已经具有多线程操作。虽然在技术上可行,但您也可能在不经意间抢夺系统资源,因为 httpruntime 管理为您的服务提供请求的资源。

写入本地 log4net 文件并在离线例程中导入该数据比实时日志记录、异步或其他方式具有更高的可用性,因为您的 sql 服务器可以离线并且您的服务仍然可用。如果您不需要 sql server 进行日志记录以外的任何操作,则最好将 db 操作排除在 webmethod 之外。

于 2008-12-30T16:12:02.880 回答
0

如果这只是客户端的即发即弃调用,您的 Web 服务可以将详细信息添加到队列并返回给客户端。我已经使用 MSMQ 来实现类似于您所描述的内容。它不会修复数据库超时,但它确实会从您的客户端中删除错误消息。

于 2008-12-30T16:49:55.063 回答