[英]UWP ThreadPoolTimer wait until work item finished
我需要實現一個定期計時器(10秒),該計時器將檢查一些更改並更新數據庫和UI。 我需要等到“作業”完成后再重新啟動計時器。 我打電話
timer.Cancel()
在“作業”開始時,然后在完成時再次創建計時器。 但是似乎當我使用使用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));
}
問題是,如何才能等到“作業”完成然后再開始?
您可以做些不同。 但是代碼會更加清晰,無論如何您都將使用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;
}
這只是一個總的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.