Como faço para detectar chamadas em espera WCF assíncrono?

votos
3

I fazer chamadas para um serviço WCF do meu aplicativo Silverlight. Estou fazendo isso de forma assíncrona e não estou a bloquear a execução depois de fazer a assíncrona. chamada (isso significa, eu não estou usando o mecanismo de frm espera-se juntar a esta página ). Eu não quero que o fluxo para ficar bloqueado.

No entanto, eu gostaria de detectar que a chamada WCF entrou em um estado de espera para que eu possa mostrar um ícone de ocupado na UI - uma comunicação visual indicando que as coisas estão acontecendo por trás da interface do usuário.

Eu posso mudar o meu código de tal forma que eu posso começar a animar o ícone de ocupado e parar que a animação quando a chamada assíncrona for concluída.

No entanto, este é um monte de código bolierplate, e com mais chamadas feitas por todo o código do cliente, isso só vai ficar mais confusa.

Assim, há qualquer método ou propriedade exposta pelo código de referência de cliente do serviço WCF que pode ser usado para desencadear eventos quando quaisquer chamadas de serviço assíncrono WCF entrar em um estado de espera, e da mesma forma, desencadear eventos quando as todas as chamadas de serviço assíncrono WCF terminar ?

Publicado 20/02/2009 em 06:50
fonte usuário
Em outras línguas...                            


1 respostas

votos
4

Não há nenhuma propriedade ou evento na classe de referência do cliente gerado que pode ser usado para identificar que uma chamada assíncrona para um método de um serviço Silverlight WCF é atualmente em andamento . Você pode gravar este mesmo usando uma variável booleana simples embora, ou usando a sincronização de threads de bloqueio que você mencionou que quer evitar neste caso.

Aqui está um exemplo de como fazer o que quiser usando o controle do Silverlight ProgressBar para indicar espera / trabalhando em uma chamada para um muito simples serviço web Silverlight:

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="100">

    <StackPanel x:Name="LayoutRoot" Background="White">
        <Button x:Name="ButtonDoWork" Content="Do Work"
                Click="ButtonDoWork_Click"
                Height="32" Width="100" Margin="0,20,0,0" />
        <ProgressBar x:Name="ProgressBarWorking"
                     Height="10" Width="200" Margin="0,20,0,0" />
    </StackPanel>
</UserControl>

Page.xaml.cs:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using SilverlightApplication1.ServiceReference1;

namespace SilverlightApplication1
{
    public partial class Page : UserControl
    {
        public bool IsWorking
        {
            get { return ProgressBarWorking.IsIndeterminate; }
            set { ProgressBarWorking.IsIndeterminate = value; }
        }

        public Page()
        {
            InitializeComponent();
        }

        private void ButtonDoWork_Click(object sender, RoutedEventArgs e)
        {
            Service1Client client = new Service1Client();
            client.DoWorkCompleted += OnClientDoWorkCompleted;
            client.DoWorkAsync();

            this.IsWorking = true;
        }

        private void OnClientDoWorkCompleted(object sender, AsyncCompletedEventArgs e)
        {
            this.IsWorking = false;
        }
    }
}

Definir IsIndeterminate para true após a chamada assíncrona para DoWork faz a barra de progresso animar indeterminadamente assim:

texto alt http://www.freeimagehosting.net/uploads/89620987f0.png

Porque a chamada de retorno para OnClientDoWorkCompleted acontece na UI fio é bom para alterar o valor da propriedade IsIndeterminate volta para falso no corpo do método; isto resulta em um ProgressBar em branco não-animar novamente quanto a trabalho / de espera está agora terminada.

Abaixo está o código para o serviço web eo método DoWork que o código acima chama de forma assíncrona, tudo o que ele simular alguma tarefa de longa duração por dormir durante 5 segundos:

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Threading;

namespace SilverlightApplication1.Web
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1
    {
        [OperationContract]
        public void DoWork()
        {
            Thread.Sleep(TimeSpan.FromSeconds(5.0));
            return;
        }
    }
}
Respondeu 20/02/2009 em 10:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more