ThreadPool 完成时如何得到通知?
How to get notified when ThreadPool is finished?
我有一个工作申请,每 X 分钟定期导入/导出。
一些导入需要时间(例如 60 秒)并且为了避免冻结我的整个应用程序(我有一个日志屏幕可以查看发生了什么),我为我的 Worker 实现了线程:
/// <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 就不会被当前 运行 的作业超时。
但是我不能再启用他了,因为threaded方法上的JobTimer好像和call方法上的不一样...
那么当我的 Async ThreadPool 完成时我如何得到通知?
新的基于任务的 async/await 功能使表达这一点变得更加容易。如何解雇计时器并使用任务重述您的问题:
所以:
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);
}
}
我有一个工作申请,每 X 分钟定期导入/导出。
一些导入需要时间(例如 60 秒)并且为了避免冻结我的整个应用程序(我有一个日志屏幕可以查看发生了什么),我为我的 Worker 实现了线程:
/// <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 就不会被当前 运行 的作业超时。 但是我不能再启用他了,因为threaded方法上的JobTimer好像和call方法上的不一样...
那么当我的 Async ThreadPool 完成时我如何得到通知?
新的基于任务的 async/await 功能使表达这一点变得更加容易。如何解雇计时器并使用任务重述您的问题:
所以:
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);
}
}