如何在ThreadPool完成后收到通知?

时间:2015-04-15 08:27:22

标签: c# threadpool

我有一个工作申请,每隔X分钟就会定期进口/出口。

一些Imports需要时间(例如60秒)并且为了避免冻结我的完整应用程序(我有一个日志屏幕以查看会发生什么),我实施了线程给我的工人:

 /// <summary>
    /// Eigentlicher JobTimer Tick, schmeißt den Worker jeden Tick neu an.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void JobTimer_Tick(object sender, EventArgs e)
    {
        WriteLog("Jobtimer Tick");
        JobTimer.Enabled = false;
        ThreadPool.QueueUserWorkItem(StartWorker);

    }

    /// <summary>
    /// StartWorker Wrapper for Threading
    /// </summary>
    /// <param name="state"></param>
    private void StartWorker(object state)
    {
        Worker w = new Worker();
        w.StartWork(); //<--- Jobs will be Done here
        JobTimer.Enabled = true; //<---Problem here
    }

我的问题是,我必须禁用JobTimer(每隔1000毫秒检查一次是否有作业),这样JobTimer就不会被当前正在运行的作业所覆盖。 但是我无法再次启用它,因为看起来线程方法上的JobTimer与调用方法上的JobTimer不同......

那么当我的Async ThreadPool完成后如何收到通知?

1 个答案:

答案 0 :(得分:3)

新的基于任务的异步/等待功能使表达更容易。如何解决计时器并使用任务重新解决问题:

所以:

public async Task RunWorkLoop(CancellationToken token)
{
    while(!token.IsCancellationRequested)
    {
        //runs in ThreadPool, doesn't complete until StartWork is done
        await Task.Run(() => new Worker().StartWork()); 
        await Task.Delay(someTimeInterval);
    }
}