Pergunta

Eu tenho um serviço Web ASMX simples que só precisa registrar algumas informações em um banco de dados transacional. No entanto, é o tempo para o cliente. A chamada para atualizar o banco de dados apenas chama 1 procedimento armazenado e não acredito que possa ser otimizado ainda mais para melhor desempenho. Fui reduzido para apenas registrar a execução usando o log4net e depois ler o login por um processo separado que atualiza o banco de dados.

Eu queria saber se existe uma maneira melhor de fazer isso. Eu queria saber se existe uma maneira de fazer meu código fazer algo como:

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

  Asynchronously call method to insert transaction

  return true;  
}
Foi útil?

Solução

EDITAR: Eu estava errado sobre o BackgroundWorker. Então, eu chorei para a versão do thread, testada.

Se você deseja que o trabalho seja feito de forma assíncrona, pode estudar como iniciar outro tópico.

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();
    }
}

Levaria 10 segundos para o método de log para terminar o processamento se a linha Thread.Sleep (10000) estiver no próprio método de log. No entanto, com Tópico a, O método de log retornará imediatamente após a chamada.

Observe também que não há maneira fácil de garantir o cliente de chamada se a operação de inserção estiver concluída ou não, com esse estilo de chamada assíncrona.

Outras dicas

Uma coisa que você pode querer tentar é Rastreamento.

Se a consulta não puder ser otimizada mais, você poderá aumentar o Valor de tempo limite para o seu cliente SQL Supondo que você possa estar usando o SQL Server.

No lado do cliente que consome o serviço da Web, você pode usar esse método de forma assíncrona se quiser que o cliente continuasse executando outras operações. Quando o método da Web terminar, ele acionará um evento. Há um pequeno exemplo agradável Você pode ler aqui Se você acha que pode ajudar.

Enquanto você pode procurar operações assíncronas dentro do seu webMethod, você está trabalhando com threads e/ou o Threadpool dentro do ASP.NET, que já possui operações de threading com vários threading. Embora tecnicamente viável, você também pode roubar inadvertidamente o sistema de recursos, à medida que o HTTPRUNTIME gerencia os recursos em atender solicitações ao seu serviço.

Escrever no arquivo log4net local e importar esses dados em uma rotina offline é maior disponibilidade do que o registro em tempo real, assíncrono ou não, pois seu servidor SQL pode estar offline e seu serviço ainda está disponível. Se você não precisar de SQL Server para algo que não seja o log, prefira manter as operações de banco de dados fora do webMethod.

Se for apenas uma chamada de incêndio e esquecimento para o cliente, seu serviço da web poderá adicionar os detalhes a uma fila e retornar ao cliente. Eu usei o MSMQ para implementar algo semelhante ao que você está descrevendo. Ele não corrige o tempo limite do banco de dados, mas retira a mensagem de erro de seus clientes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top