C#检查文件夹以避免阻塞UI



这是我用来检查目录是否存在的代码。由于该目录可能也是一个网络文件夹,我设置了一个超时。代码有效,但它阻止了我的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所指出的,您可以在另一个线程中执行此操作,并使用asyncawaitTask.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));
}

最新更新