我有一个基类,我将使用它来迭代文件和目录,如下所示:
public abstract class FileRecursionBase
{
protected DirectoryInfo Info;
protected FileRecursionBase(string sourceDirectory, string targetDirectory)
{
SetSourceDirectory(sourceDirectory);
TargetDirectory = targetDirectory;
}
private string _sourceDirectory;
protected string GetSourceDirectory()
{
return _sourceDirectory;
}
protected void SetSourceDirectory(string value)
{
_sourceDirectory = value;
Info = new DirectoryInfo(value);
}
protected string TargetDirectory { get; set; }
protected abstract void ProcessFile(FileInfo file);
protected abstract void ProcessDirectory(DirectoryInfo directory);
protected void EnumerateFiles()
{
foreach (var file in Info.EnumerateFiles())
{
ProcessFile(file);
}
}
protected void EnumerateDirectories()
{
foreach (var directory in Info.EnumerateDirectories())
{
ProcessDirectory(directory);
}
}
public virtual void Initialize()
{
EnumerateDirectories();
}
}
为简单起见,我们制作一个实现此类的简单计数类
public class FileCounter : FileRecursionBase
{
protected ICounter Counter;
public FileCounter(string sourceDirectory, string targetDirectory, ICounter counter) : base(sourceDirectory, targetDirectory)
{
Counter = counter;
}
protected override void ProcessFile(FileInfo file)
{
Counter.Files++;
Counter.FileSize += file.Length;
}
protected override void ProcessDirectory(DirectoryInfo directory)
{
SetSourceDirectory(directory.FullName);
try
{
EnumerateFiles();
EnumerateDirectories();
}
catch (Exception)
{
//ignore
}
}
}
该类按预期工作,并基于ProcessDirectory和ProcessFiles方法递归枚举。
但是,对于我想异步处理ProcessFiles的情况,我该怎么办? 由于抽象类使用的是受保护的方法,因此我无法等待初始化的空白。
我是否必须更改整个基类才能使用Tasks,即使是类 有孩子不是异步的吗?
或者正确的方法是创建一个使用Tasks并复制并粘贴大部分代码的新基类?只是看看是否有人有想法或我是否忽略了某些事情。
答案 0 :(得分:-1)
实际上,在第二个想法中,我确实不需要使基本方法异步。
我可以简单地在子类中同时使ProcessFile和ProcessDirectory同步。
绝大多数异步任务本质上是I / O绑定的,所以它不应该锁定UI线程。
如果它确实如此,按照最佳实践我会在Task.Run中调用阻塞代码,因为它在那时是CPU绑定代码;将基类更改为任务方法根本不会有任何帮助,因为它在那时在一个单独的线程中运行。
抱歉,浪费时间。