如何识别该表单正在消耗数据服务

时间:2013-09-04 12:41:55

标签: c# winforms wcf wcf-data-services

我有一个使用WCF数据服务的C#WinForms应用程序,我无法找到一种方法来了解应用程序是否正在对Web服务进行处理。我试图实现IClientMessageInspector等,但似乎它不起作用。

当Windows窗体应用程序使用Web服务时,还有其他方法可以捕获吗?目的是在打开与服务的通信时显示“正在运行的进程”图标,然后在它关闭时隐藏它。

感谢。

1 个答案:

答案 0 :(得分:0)

您应该在调用WcfService方法的位置添加事件,然后在UI层中侦听此事件。在此事件中使用自定义事件参数,您应该提供更多信息来使用UI层,例如枚举值Connected,TransferStarted,TransferEnded,Closed,...

我认为有两种主要可能的情况: Wcf通信发生同步 - 你正在调用一些使用wcf服务处理连接/请求/响应的对象的包装器方法 - 在这种情况下我认为它很简单,你在每次调用包装器之前做出UI动作,例如

try
{
 WcfEx.IwcfS5ExtensionClient client = new IwcfS5ExtensionClient("MyEndpointConfigurationName");
 client.Open();
 if (client.State == CommunicationState.Opened)
 {
     //change UI to Connected
 }
 else
 {
     //change ui to Connection Error
 }
 Application.DoEvents();
 //Change UI to Transfering data
 Application.DoEvents();
 client.DoWork();
 //change UI to transfer done
 Application.DoEvents();
 client.Close();
 //change ui to Closed
}
catch (Exception e)
{
   //change ui to Comunication error
}

其次是wcf通信是异步的 -i将在今天晚些时候添加更多的软化样本 编辑:异步工作和通知表单的示例

using System;
using System.ComponentModel;
using System.Threading;

using WcfEx;

public class MyForm : Form
{
    public MyForm()
    {
        WcfHandler WcfConnection = new WcfHandler();
        WcfConnection.ProgressChanged += WcfConnectionOnProgressChanged;
    }

    private delegate void WcfConnectionOnProgressChangedDelegate(object Sender, WcfHandler.ProgressChangedEventArgs EventArgs);

    private void WcfConnectionOnProgressChanged(object Sender, WcfHandler.ProgressChangedEventArgs EventArgs)
    {
        //multi thread synchronization check
        if (this.InvokeRequired)
        {
            object[] Parameters = new object[2];
            Parameters[0] = Sender;
            Parameters[1] = EventArgs;
            this.Invoke(new WcfConnectionOnProgressChangedDelegate(WcfConnectionOnProgressChanged), Parameters);
        }
        else
        {
            if (EventArgs == null)
                return;

            switch (EventArgs.StateValue)
            {
                case WcfHandler.ProgressChangedEventArgs.State.Started:
                    {
                        this.Text = "Starting connection...";
                        break;
                    }
                case WcfHandler.ProgressChangedEventArgs.State.Processing:
                    {
                        this.Text = "Downloading updates...";
                        break;
                    }
                case WcfHandler.ProgressChangedEventArgs.State.Finished:
                    {
                        this.Text = EventArgs.Succes ? "Update completed" : "Update failed";
                        break;
                    }
            }

            Application.DoEvents();
        }
    }


    public class WcfHandler
    {
        public class ProgressChangedEventArgs : EventArgs
        {
            public enum State : int
            {
                Started,
                Processing,
                Finished
            };

            public bool Succes { get; set; }
            public State StateValue { get; set; }
        }

        public delegate void ProgressChangedEventHandler(object sender, ProgressChangedEventArgs EventArgs);

        public event ProgressChangedEventHandler ProgressChanged;

        protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
        {
            if (ProgressChanged != null)
            {
                ProgressChanged(this, e);
            }
        }

        public void StartChecking()
        {
            BackgroundWorker bWorker = new BackgroundWorker();

            bWorker.DoWork += CheckStatesAsync;
            bWorker.RunWorkerCompleted += BWorkerOnRunWorkerCompleted;

            bWorker.RunWorkerAsync();
        }

        private void CheckStatesAsync(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                WcfEx.IwcfS5ExtensionClient client = new IwcfS5ExtensionClient("MyWcfBindingConfig");
                ProgressChangedEventArgs Controller = new ProgressChangedEventArgs();
                Controller.StateValue = ProgressChangedEventArgs.State.Started;
                Controller.Succes = true;

                this.OnProgressChanged(Controller);

                try
                {
                    client.Open();

                    Controller.StateValue = ProgressChangedEventArgs.State.Processing;
                    Controller.Succes = true;
                    this.OnProgressChanged(Controller);

                    //do some work
                }
                catch (Exception)
                {
                    this.OnProgressChanged(new ProgressChangedEventArgs()
                                               {
                                                   StateValue = ProgressChangedEventArgs.State.Finished,
                                                   Succes = false
                                               });
                }

                Thread.Sleep(8000);
            }
        }

        private void BWorkerOnRunWorkerCompleted(object Sender, RunWorkerCompletedEventArgs RunWorkerCompletedEventArgs)
        {
            ProgressChangedEventArgs Controller = new ProgressChangedEventArgs();
            Controller.StateValue = ProgressChangedEventArgs.State.Finished;
            Controller.Succes = true;
            this.OnProgressChanged(Controller);
        }
    }