José Carbonell
José Carbonell

Reputation: 91

How to add more milliseconds Delay in delay var c#

I would like to add more delay in delay var while the execution waits

Example:

private System.Threading.Tasks.Task delayVar; //Delay var

private async void createDelay() //First function
{
  delayVar = System.Threading.Tasks.Task.Delay(milliseconds);
  await delayVar;
}
private void addDelay() //Second function
{
  delayVar.Milliseconds +=5000;
}

Thanks.

Upvotes: 0

Views: 413

Answers (1)

Mihir Dave
Mihir Dave

Reputation: 4024

You can't "reset" a Task.Delay, but you can reset a timer which makes it an ideal candidate to solve this problem.

Here's an example:

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));
}

But you don't have to use timers, you can still use Task.Delay with an additional task: the idea is to wait on two tasks, the delay and waiting for the files to change (you can use TaskCompletionSource to "create" a task from an event). If the delay task completes first, fire your code.

Here's an example:

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>();
}

Upvotes: 6

Related Questions