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

上記の答えは私を大いに助けてくれましたが、問題が 1 つあります。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 に答える