C#检查文件夹避免阻塞用户界面

C#检查文件夹避免阻塞用户界面,c#,delegates,directory,C#,Delegates,Directory,这是我用来检查目录是否存在的代码。由于目录可能也是一个网络文件夹,我设置了一个超时。代码可以工作,但它会阻止我的UI: private delegate bool DirectoryExistsDelegate(string folder); public static bool DirectoryExists(string path, int timeout = 2000) { bool retValue = false; try

这是我用来检查目录是否存在的代码。由于目录可能也是一个网络文件夹,我设置了一个超时。代码可以工作,但它会阻止我的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;
        }
    }

如何解决此问题?

在Exists调用完全完成之前,您的方法不会返回,因此它将始终阻止UI。基本上,您已经启动了一个异步操作,但随后会坐在那里玩弄拇指,等待它完成

正如Dmitry Bychenko所指出的,您可以在另一个线程中执行此操作,并使用
async
wait
Task.Run
非常干净地处理它。为此,还应使调用此方法的事件处理程序异步,例如:

//异步事件处理程序
公共异步无效按钮\u单击(…)
{
...
var exists=等待目录exists(myPath);
...
}
公共异步任务目录存在(字符串路径)
{
返回wait Task.Run(()=>Directory.Exists(path));
}