我继承了 C#/XAML/Win 8 应用程序。有一些代码设置为每 n 秒运行一次。
设置它的代码是:
if(!_syncThreadStarted)
{
await Task.Run(() => SyncToDatabase());
_syncThreadStarted = true;
}
上面的代码运行一次。
然后在 SyncToDatabase() 我们有:
while (true)
{
DatabaseSyncer dbSyncer = new DatabaseSyncer();
await dbSyncer.DeserializeAndUpdate();
await Task.Delay(10); // after elapsed time re-run above code
}
DeserializeAndUpdate 方法查询内存中的对象集合并将这些对象推送到 Web 服务。
有时,向 Web 服务发送请求的时间比预期的要长,这意味着发送了重复的项目。
问题:有没有办法让我可以在 SyncToDatabase() 方法中停止/中止/销毁线程或某种类型的线程池/后台工作程序,然后在完成后初始化/启动它?这将确保在前一个请求仍处于未决状态时不会触发后续请求。
编辑:我对线程不是很了解,但我想要的逻辑是:
创建每 x 秒运行一次方法的线程,当它启动该线程时停止“每 x 秒运行”部分,在线程完成后再次启动“每 x 秒运行”部分。
例如,如果线程在上午 10:01:30 开始并且直到上午 10:01:39(9 秒)才完成,那么下一个线程应该在上午 10:01:44(工作完成后 5 秒)开始 - 这有意义吗?我不想同时运行 2 个或更多线程。
这是我的上述代码:
var period = TimeSpan.FromSeconds(5);
var completed = true;
ThreadPoolTimer syncTimer = ThreadPoolTimer.CreatePeriodicTimer(async (source) =>
{
// stop further threads from starting (in case this work takes longer than var period)
syncTimer.Cancel();
DatabaseSyncer dbSyncer = new DatabaseSyncer();
await dbSyncer.DeserializeAndUpdate(); // makes webservices calls
Dispatcher.RunAsync(CoreDispatcerPriority.High, async () =>
{
// Update UI
}
completed = true;
}, period,
(source) =>
{
if(!completed)
{
syncTimer.Cancel(); // not sure if this is correct...
}
}
谢谢,安德鲁)