& Ldquo; Хранение & Rdquo; задание для последующего завершения

Если вам хорошо с помощью библиотеки std c:

#include <sys/stat.h>
off_t fsize(char *file) {
    struct stat filestat;
    if (stat(file, &filestat) == 0) {
        return filestat.st_size;
    }
    return 0;
}
2
задан Matt Jones 18 March 2019 в 16:58
поделиться

2 ответа

Вы думаете о ленивой загрузке? Вы можете использовать Lazy<Task> (который инициализирует задачу, но не ставит ее в очередь на выполнение).

var tasks = new Dictionary<Guid, Lazy<Task>>();

tasks.Add(Task1Guid, new Lazy<Task>(() => { whatever the 1st task is }));
tasks.Add(Task2Guid, new Lazy<Task>(() => { whatever the 2nd task is }));


void async RunTaskAsync(Guid guid)
{
   await tasks[guid].Value;
}
0
ответ дан Neil 18 March 2019 в 16:58
поделиться

Если я правильно понимаю ваш вариант использования, вы можете использовать TaskCompletionSource.

Пример реализации:

public class AsyncCache
{
    private Dictionary<Guid, Task<string>> _cache;

    public Task<string> GetAsync(Guid guid)
    {
        if (_cache.TryGetValue(guid, out var task))
        {
            // The value is either there or already queued
            return task;
        }

        var tcs = new TaskCompletionSource<string>(TaskCreationOptions.RunContinuationsAsynchronously);

        _queue.Enqueue(() => {
           var result = LoadResult();
           tcs.TrySetValue(result);
        });

        _cache.Add(guid, tcs.Task);

        return tcs.Task;            
    }
}

Здесь _queue - это любой механизм организации очередей, который вы собираетесь использовать для обработки данных. Конечно, вам также придется сделать этот код поточно-ориентированным.

0
ответ дан Kevin Gosse 18 March 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: