C # Проверьте папку, чтобы избежать блокировки пользовательского интерфейса - PullRequest
0 голосов
/ 20 ноября 2018

Это мой код, чтобы проверить, существует ли каталог.Поскольку каталог может быть также сетевой папкой, я поставил тайм-аут.Код работает, но он блокирует мой пользовательский интерфейс:

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

Как решить эту проблему?

1 Ответ

0 голосов
/ 20 ноября 2018

Ваш метод не возвращается до тех пор, пока вызов Exists не будет полностью завершен, поэтому он всегда будет блокировать пользовательский интерфейс.По сути, вы начали асинхронную операцию, но затем бездельничайте, ожидая ее завершения.

Как отметил Дмитрий Быченко, вы можете сделать это в другом потоке и обрабатывать его очень аккуратно, используя asyncawait и Task.Run.Для этого вы также должны сделать обработчик событий, который вызывает этот метод async, например:

// An async event handler
public async void Button_Click(...)
{
    ...
    var exists = await DirectoryExists(myPath);
    ...
}

public async Task<bool> DirectoryExists(string path)
{
    return await Task.Run<bool>(() => Directory.Exists(path));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...