UWP ThreadPoolTimer 等到工作项完成
UWP ThreadPoolTimer wait until work item finished
我需要实现一个周期性计时器(10 秒),它将检查一些更改并更新数据库和 UI。我需要等到 "Job" 完成,然后再次启动计时器。我叫
timer.Cancel()
在 "Job" 开始,然后在完成时再次创建计时器。但是似乎当我使用使用 async 关键字的工作项处理程序时,线程池工作项可能会在处理程序中的所有代码执行之前设置为完成状态。
查看完整代码:
private bool IsStop = false;
private async Task DoWork()
{
try
{
if (IsStop)
{
Stop();
return;
}
timer.Cancel();
var resultIds = await DB.getUnresolvedData();
if (resultIds.IsNullOrEmpty())
{
return;
}
var json = await server.RequestSTatus(resultIds);
if (string.IsNullOrEmpty(json))
return;
Model result = JsonConvert.DeserializeObject<Model>(json);
UpdateDB(result);
}
catch (Exception ex)
{
}
finally
{
Start();
}
}
public void Start()
{
if (IsStop) return;
timer = ThreadPoolTimer.CreatePeriodicTimer(async (t) =>
{
await DoWork();
}, TimeSpan.FromSeconds(10));
}
问题是,我如何才能等到 "Job" 完成后再重新开始?
你可以做一些不同的事情。但代码会更清晰,无论如何你都会使用 ThreadPool。只需使用 Task.Delay 作为定时器。像这样。
private bool isRunning;
public async void Start()
{
if (isRunning)
return;
isRunning = true;
while (isRunning)
{
await DoWork();
//wait period.
await Task.Delay(TimeSpan.FromSeconds(10));
if (!isRunning)
return;
}
}
private async Task DoWork()
{
//Do your work here.
}
public void Stop()
{
isRunning = false;
}
这只是一个大概的想法。
我需要实现一个周期性计时器(10 秒),它将检查一些更改并更新数据库和 UI。我需要等到 "Job" 完成,然后再次启动计时器。我叫
timer.Cancel()
在 "Job" 开始,然后在完成时再次创建计时器。但是似乎当我使用使用 async 关键字的工作项处理程序时,线程池工作项可能会在处理程序中的所有代码执行之前设置为完成状态。 查看完整代码:
private bool IsStop = false;
private async Task DoWork()
{
try
{
if (IsStop)
{
Stop();
return;
}
timer.Cancel();
var resultIds = await DB.getUnresolvedData();
if (resultIds.IsNullOrEmpty())
{
return;
}
var json = await server.RequestSTatus(resultIds);
if (string.IsNullOrEmpty(json))
return;
Model result = JsonConvert.DeserializeObject<Model>(json);
UpdateDB(result);
}
catch (Exception ex)
{
}
finally
{
Start();
}
}
public void Start()
{
if (IsStop) return;
timer = ThreadPoolTimer.CreatePeriodicTimer(async (t) =>
{
await DoWork();
}, TimeSpan.FromSeconds(10));
}
问题是,我如何才能等到 "Job" 完成后再重新开始?
你可以做一些不同的事情。但代码会更清晰,无论如何你都会使用 ThreadPool。只需使用 Task.Delay 作为定时器。像这样。
private bool isRunning;
public async void Start()
{
if (isRunning)
return;
isRunning = true;
while (isRunning)
{
await DoWork();
//wait period.
await Task.Delay(TimeSpan.FromSeconds(10));
if (!isRunning)
return;
}
}
private async Task DoWork()
{
//Do your work here.
}
public void Stop()
{
isRunning = false;
}
这只是一个大概的想法。