C # ждет задачи - PullRequest
       12

C # ждет задачи

0 голосов
/ 13 марта 2019

В моем корпоративном приложении мне нужно проверять наличие файла (в основном по сети) каждые 800 мс. Текущий метод, который отлично работает, это:

private delegate bool FileExistsDelegate(string file);
public static bool FileExists(string path, int timeout = 2000)
{
    bool retValue = false;
    try
    {
        FileExistsDelegate callback = new FileExistsDelegate(File.Exists);
        IAsyncResult result = callback.BeginInvoke(path, null, null);
        if (result.AsyncWaitHandle.WaitOne(timeout, false))
            return callback.EndInvoke(result);
        return false;
    }
    catch
    {
        return false;
    }
}

Проблема в том, что пользовательский интерфейс замораживается, если путь не найден, поэтому я переписал его, используя Задание как:

public static bool FileExists(string path, int timeout = 2000)
{
    Func<bool> func = () => File.Exists(path);
    Task<bool> task = new Task<bool>(func);
    task.Start();
    if (task.Wait(timeout))
    {
        return true;
    }
    return false;
}       

Проблема в том, что моя задача не ждет, как ожидалось, кажется, что тайм-аут не используется. Правильный ли этот подход в использовании Task / Wait? Формат файла выглядит как "\\ 10.100.100.1 \ status.txt"

1 Ответ

0 голосов
/ 13 марта 2019

Вы не возвращаете Result из Task.

public static bool FileExists(string path, int timeout = 2000)
{
    Task<bool> task = Task.Run(() => File.Exists(path));
    return task.Wait(timeout)) && task.Result;
}
  • Возвращает false в случае сбоя Task или Result false.
  • Возвращает true, если Task успешно и если Result true.
...