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