【问题标题】:How to automate task of consuming webservice如何自动化使用 Web 服务的任务
【发布时间】:2014-09-17 01:27:52
【问题描述】:

我有一个 winform 应用程序,它需要使用 Web 服务。 Web 服务检查数据库中的任何更改。如果数据库中有任何更改,应该通知 winform 应用程序并相应地执行一些任务。我该怎么做?

我想在我的 winform 应用程序中使用计时器,然后说每 5 分钟连接到一个 Web 服务并检查数据库中是否进行了新的更改。有没有其他办法呢?

更新:

我根据答案在这里发布代码:

类 PerformTasks {

    public static bool checkIfInProgress { get; set; }

    public static void InitializeWebService()
    {
        try
        {
            Timer = new System.Timers.Timer(2000);
            Timer.Elapsed += OnTimedEvent;
            Timer.Enabled = true;
        }
     }

     private static void callService()
     {
        using (var service = new WebServiceSoapClient())
        {
            checkIfInProgress = true;
            task1();
            task2();
            popMessage();
            checkIfInProgress = false;
        }
     }

     private static void OnTimedEvent(Object source, ElapsedEventArgs e)
     {
        if (checkIfInProgress == false)
        {
            callService();
        }
     }

     private static void PpopMessage()
     {
         var form = new Form
            {
                StartPosition = FormStartPosition.Manual,
                ShowInTaskbar = false,
                Text = "Message",
                Size = new Size(500, 200),
             };
            var screen = Screen.FromPoint(form.Location);
            Label lblText = new Label();
            lblText.Text ="Test Text";
            lblText.Dock = DockStyle.Fill;
            lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            form.MaximizeBox = false;

            form.Controls.Add(lblText);
            form.Location = new Point(screen.WorkingArea.Right - form.Width, screen.WorkingArea.Bottom - form.Height);
            form.Show();
     }

现在一切正常,除了 1 个任务,即 popMessage(顶部的代码 sn-p)。 此处表单已打开,但似乎总是在加载。在使用时间之前,它曾经可以正常工作。我该如何处理?

【问题讨论】:

  • 计时器适用于 WinForms。

标签: c# .net winforms web-services polling


【解决方案1】:

这是唯一的方法,尤其是在 Web 服务不是基于 WCF 或您无力修改它的情况下。

如果您使用计时器,请确保您使用 System.Timers.Timer 并按照说明 here 以便在 UI 线程上执行 Elapsed 处理程序。此外,当计时器滴答作响时,您可能应该生成一个工作线程(或任务,或等待异步方法)来进行服务调用。您不希望在服务调用正在进行时阻止您的 UI。

如果您可以控制 Web 服务,那么您可能想要探索 WCF Duplex Services,它允许您从服务中回调客户端。

【讨论】:

  • 感谢您的快速回复。我将使用计时器,但只有 1 个困难:我有多个任务要在 Winform 应用程序上执行,那么如何在所有任务完成之前停止时间,然后再次启动计时器?
  • @user1650891:如果您知道应用程序中是否正在进行任务,那么您可以将计时器分辨率增加到 1 分钟左右,并且每次触发时检查任务是否正在进行中。如果是,那就再等一会儿。可能同样适用于任务。在启动它们之前,您需要检查是否正在进行 Web 服务调用。这只是同步这两个组件的问题。
  • 是的,我可以检查任务是否正在进行中。如果正在进行中,那么我该如何等待更多时间?怎么办?
  • @user1650891:您只是在那里什么都不做,计时器将在您在Interval 属性中指定的时间内再次触发。要创建重复计时器,请确保将其 AutoReset 属性设置为 true(无论如何它都是默认值)。
  • 谢谢,我已经更新了我的问题,请看一下。我的任务是在屏幕上弹出一条消息。现在,由于使用了时间并且计时器永远不会结束,弹出消息只会继续加载。我不想停止时间,因为它应该不断检查数据库中的更改。我现在应该如何在我的应用程序中使用计时器来弹出消息?
【解决方案2】:

SignalR 允许您实现 Web 服务来实时执行此操作(无需计时器或更新之间的延迟)。它允许您在客户端和服务器之间建立持久连接,然后服务器可以在任何时候使用传输堆栈向客户端发送消息; WebSockets、服务器发送事件、永久帧和长轮询)基于按该顺序提供的支持。

您可以使用 SignalR 建立连接,并在服务器上发生某些事情时(例如您提到的数据库中的更改)向所有需要通知的客户端广播。例如。

Clients.All.notifyDatabaseChanged(args);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2011-06-20
    • 2012-07-16
    相关资源
    最近更新 更多