Pergunta

Eu criei um webservice e quando quero usar seus métodos eu o instancio no procedimento a, chamo o método e finalmente o descarto, porém acho que também poderia ser bom instanciar o webservice no "private void Main_Load(objeto remetente, EventArgs e)" evento.

Acontece que se eu fizer da primeira forma terei que instanciar o webservice toda vez que precisar de um de seus métodos mas na outra forma tenho que manter um webservice conectado o tempo todo quando utilizo ele em um formulário por exemplo.

Gostaria de saber quais dessas práticas são melhores ou se existe uma maneira muito melhor de fazer isso

Estratégia 1

private void btnRead_Click(object sender, EventArgs e)
{
    try
    {
        //Show clock
        this.picResult.Image = new Bitmap(pathWait);

        Application.DoEvents();

        //Connect to webservice
        svc = new ForPocketPC.ServiceForPocketPC();
        svc.Credentials = new System.Net.NetworkCredential(Settings.UserName, Settings.Password);
        svc.AllowAutoRedirect = false;
        svc.UserAgent = Settings.UserAgent;
        svc.PreAuthenticate = true;
        svc.Url = Settings.Url;
        svc.Timeout = System.Threading.Timeout.Infinite;

        svc.CallMethod();
         ...
    }
    catch (Exception ex)
    {
        ShowError(ex);
    }
    finally
    {
        if (svc != null)
            svc.Dispose();
    }
}

Estratégia 2

private myWebservice svc;

private void Main_Load(object sender, EventArgs e)
{
    //Connect to webservice
    svc = new ForPocketPC.ServiceForPocketPC();
    svc.Credentials = new System.Net.NetworkCredential(Settings.UserName, Settings.Password);
    svc.AllowAutoRedirect = false;
    svc.UserAgent = Settings.UserAgent;
    svc.PreAuthenticate = true;
    svc.Url = Settings.Url;
    svc.Timeout = System.Threading.Timeout.Infinite;
}

private void btnRead_Click(object sender, EventArgs e)
{
    try
    {
        //Show clock
        this.picResult.Image = new Bitmap(pathWait);

        Application.DoEvents();
        svc.CallMethod();
         ...
    }
    catch (Exception ex)
    {
        ShowError(ex);
    }
}

private void Main_Closing(object sender, CancelEventArgs e)
{
    svc.Dispose();
}
Foi útil?

Solução

Depende de quantas vezes você ligará para o serviço da web.Se você vai chamá-lo quase constantemente, provavelmente seria melhor usar o método nº 2.No entanto, se ele não for chamado com tanta frequência, é melhor usar o método nº 1 e instanciá-lo apenas quando precisar.

Outras dicas

Neste momento fiz uma solução para um dispositivo móvel e ele passa a ser usado em horários irregulares, pode ser usado em 10 minutos, 1 hora, 4 horas é muito variável, parece que a melhor abordagem é a primeira estratégia.

Ano passado entramos em um projeto onde utilizamos webservices o fato é que instanciamos nossos webservices na procedure Sub New() e funcionou muito bem porém algumas vezes alguns usuários nos reclamaram que acordaram de suas cadeiras e quando retornaram e tentaram continuar no aplicativo, receberam uma mensagem de erro de tempo limite e tiveram que fazer login novamente.

Achamos que talvez estivesse tudo bem porque talvez os usuários tenham ficado muito tempo fora de seus assentos, mas uma vez em uma apresentação do aplicativo com os CEOs aconteceu exatamente o mesmo cenário e pessoalmente não gostei desse comportamento e é por isso que a pergunta.

Obrigado pela resposta.

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