5

我目前正在将 WCF 服务项目移植到 Azure 角色。到目前为止,包含该服务的库还托管了一个 Quartz.Net JobFactory,用于一些轻量级的后台处理(定期清理过时的电子邮件确认令牌)。我是否必须将该代码移动到单独的工人角色中?

4

2 回答 2

9

不,您不必设置单独的工作者角色。

您只需在 Web 角色的 OnStart() 方法中启动一个后台线程。给该线程一个 Timer 对象,该对象在给定的时间跨度之后执行您的方法。

因此,您可以避免新的工人角色。

class MyWorkerThread 
{
    private Timer timer { get; set; }
    public ManualResetEvent WaitHandle { get; private set; }

    private void DoWork(object state)
    {
        // Do something
    }

    public void Start()
    {
        // Execute the timer every 60 minutes
        WaitHandle = new ManualResetEvent(false);
        timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(60));

        // Wait for the end 
        WaitHandle.WaitOne();
    }
}

class WebRole : RoleEntryPoint
{
    private MyWorkerThread workerThread;

    public void OnStart()
    {
        workerThread = new MyWorkerThread();
        Thread thread = new Thread(workerThread.Start);
        thread.Start();
    }

    public void OnEnd()
    {
        // End the thread
        workerThread.WaitHandle.Set();
    }
}
于 2011-06-06T08:06:43.627 回答
0

上面的答案对我帮助很大,但它有一个小问题, OnStart 方法没有被覆盖,所以该方法永远不会被调用。它也应该是布尔值而不是无效的。这对我有用:

public override bool OnStart()
{
    // For information on handling configuration changes
    // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

    workerThread = new MyWorkerThread();
    Thread thread = new Thread(workerThread.Start);
    thread.Start();

    return base.OnStart();
}
于 2014-06-11T21:10:03.087 回答