c# - 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;
}
}
如何解决这个问题?
解决方案
在 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));
}
推荐阅读
- sql - 聚合数组列中不同元素的单个数组,不包括 NULL
- python - 如何在 RaspberyPi 上通过 Python 从 MINEW Eddystone BLE 信标读取额外信息?
- linux - 如何找到转换表的基地址以进行初始查找?
- javascript - 为什么数组对象拥有长度属性?
- html - 如何在不使用负边距的情况下实现这种突出的图像布局?
- r - 为什么 rlang::quo_is_missing(quo(NA)) 评估为 FALSE?
- java - 在Java中,如果满足条件,如何在迭代之间从对象列表中删除一个对象并处理其余对象
- terraform - 如何使用 terraform 管理 GCP 密钥环
- android - 无法查询属性“applicationId”的值
- apache-spark-sql - 如何在 Databricks 中的事实表的数据透视查询 sql 中用零替换空值