我正在对Windows文件系统进行封装。
当用户请求打开文件时,Windows调用我的驱动程序来提供数据。 在正常操作中,驱动程序返回caching的文件内容,但是在某些情况下,实际文件没有被caching,我需要从networking上下载。
问题是如果可以保持Windows试图读取文件,而不阻止整个驱动器操作既不打开文件的软件,给用户一个机会,取消开放过程。
起初,我试图阻止驱动程序,直到数据可用,这种解决scheme是更直接的实施,但用户体验不是最好的。 而且,依靠networking传输不是一个好主意,传输可能会持续很长时间,驱动程序会一直阻塞。
我已经实现的第二种方法是在文件被caching的时候只返回数据,当文件不可用的时候告诉Windows文件长度为0,并且在后台进程中下载文件。 有了这个,驱动程序不会阻塞窗口,用户体验改善,但用户需要打开N次文件,直到数据可用。
我认为最好的解决办法是将窗口返回“没有数据可用,在5秒内再试一次”的消息,我认为如果驱动程序将适当的错误代码返回给Windows,这可以实现,但错误列表也是如此长,名字并不总是像你想要的描述。
你有一些build议,执行这个? 提前致谢。
您实施的行为对于驱动程序是正确的。 处理缓慢的I / O的责任在更高的层面上。 例如,Windows资源管理器非常小心,不要试图从任何文件中检索单个字节,完全依赖于元数据。
但是,当您忙时不要返回失败代码。 这就是强迫用户反复打开文件的失败。
您可能会产生一个反复尝试的线程,报告成功或超时的结果。
对我来说,显示一条消息“没有可用的数据,5秒内再试一次”听起来很糟糕,但这取决于你的参数(你也许可以详细说明你的目标是什么)。
关于从网络获取数据,这听起来就像线程起作用的一个主要例子。 你有没有考虑复制工作线程中的文件? 这样你就不必阻塞任何东西,用户也不会觉得系统挂起了