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