首页 > 解决方案 > C# 检查文件夹避免阻塞 UI

问题描述

这是我的代码,用于检查目录是否存在。由于该目录可能也是一个网络文件夹,所以我设置了一个超时。该代码有效,但它阻止了我的用户界面:

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

如何解决这个问题?

标签: c#delegatesdirectory

解决方案


在 Exists 调用完全完成之前,您的方法不会返回,因此它总是会阻塞 UI。您实际上已经启动了一个异步操作,但随后就坐在那里摆弄拇指等待它完成。

正如 Dmitry Bychenko 指出的那样,您可以在另一个线程中执行此操作,并使用async,await和非常干净地处理它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));
}

推荐阅读