【问题标题】:Engage Azure Worker Role Background Service In Win Form以 Win 形式使用 Azure Worker 角色后台服务
【发布时间】:2016-02-14 05:30:30
【问题描述】:

我创建了一个新的 winforms 应用程序。我正在尝试创建一个监听消息存储队列的类。

 using System;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using System.Threading;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.Configuration;

namespace PMonitor
{
         public class QueueWorker : RoleEntryPoint
    {

        public override void Run()
        {
               CloudQueue queue = clnt.GetQueueReference("stuff");

        while (true)
        {
            CloudQueueMessage qMessage = null;

            do
            {
                qMessage = queue.GetMessage(TimeSpan.FromSeconds(10));
                if (qMessage != null)
                {
                   //handle message
                }
            }
            while (qMessage != null);


            Thread.Sleep(10000);     
            }
        }

        public override bool OnStart()
        {

            return base.OnStart();
        }

    }

}

我如何让工作人员开始在表单中运行并在它在队列中找到消息时告诉我?

当前实例化此类并在表单加载中调用 Run() 会锁定表单。

这样做的模式是什么?

【问题讨论】:

  • 我很想知道您为什么要在 WinForm 应用程序中使用辅助角色。您介意描述一下您的用例吗?
  • 我要做的就是在此代码在队列中看到一条消息时处理一条消息。如果我在表单加载中调用这个类,它会锁定表单。我必须需要一个异步模式来获取消息,这样表单才不会被锁定?

标签: c# azure azure-worker-roles


【解决方案1】:

我怀疑对工人角色存在基本的误解。这些不是您像类一样实例化的服务。相反,这些是在 Azure 中运行的无状态虚拟机的定义。您发布的代码 sn-p 是在工作角色实例(VM)启动后运行的骨架代码,代码(例如队列消耗,在您的情况下)在 Run() 方法中运行。

WinForms 应用程序对 RoleEntryPoint 类的需求为零,因为它们专门用于在 Azure 中运行的无状态 VM。

队列处理(或您可能需要运行的任何其他任务)与工作角色无关;您的应用只需使用存储 SDK(或直接调用 REST API)即可使用队列消息。如何/在何处设置队列处理逻辑完全取决于您。

注意:您当然可以从您的 WinForms 应用程序调用在工作角色实例中运行的服务,但我认为这不是您要问的。

StackOverflow 上有几个答案更详细地介绍了工人角色,例如this one

【讨论】:

  • 我要做的就是在这段代码在队列中看到一条消息时处理一条消息。如果我在表单加载中调用这个类,它会锁定表单。我必须需要一个异步模式来获取消息,这样表单才不会被锁定?
  • 我认为您没有理解我的解释。您不能在桌面应用程序中使用您尝试在本地使用的代码。无论您是否使用异步,都无法从表单加载中调用该类。
猜你喜欢
  • 2013-04-19
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多