Вы не можете «сбросить» Task.Delay
, но вы можете сбросить таймер, который делает его идеальным кандидатом для решения этой проблемы.
Вот пример:
private System.Threading.Timer timer;
public void Start()
{
timer = new System.Threading.Timer(_ => fireMyCode());
restartTimer();
}
private void onFileChanged(object sender, EventArgs e)
{
restartTimer();
}
private void restartTimer()
{
timer.Change(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
}
Но вы не должны использовать таймеры, вы все еще можете использовать Task.Delay
дополнительная задача: идея состоит в том, чтобы ждать две задачи, задержку и ожидание файлы для изменения (вы можете использовать TaskCompletionSource
для «создания» задачи из события). Если задача задержки завершается первой, запустите свой код.
Вот пример:
TaskCompletionSource<object> fileChanged = new TaskCompletionSource<object>();
private void onFileChanged(object sender, EventArgs e)
{
fileChanged.TrySetResult(null);
}
private async Task endlessLoop()
{
while (true)
{
await handleFilesNotChanged();
}
}
private async Task handleFilesNotChanged()
{
Task timeout = Task.Delay(TimeSpan.FromMinutes(5));
Task waitForFile = fileChanged.Task;
if (await Task.WhenAny(timeout, waitForFile) == timeout)
{
fireMyCode();
}
fileChanged = new TaskCompletionSource<object>();
}
А простой таймер не вышел из моды еще. –