抽象类和异步,我应该创建一个新的基类吗?

时间:2017-12-07 04:34:17

标签: c# asynchronous

我有一个基类,我将使用它来迭代文件和目录,如下所示:

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并复制并粘贴大部分代码的新基类?只是看看是否有人有想法或我是否忽略了某些事情。

1 个答案:

答案 0 :(得分:-1)

实际上,在第二个想法中,我确实不需要使基本方法异步。

我可以简单地在子类中同时使ProcessFile和ProcessDirectory同步。

绝大多数异步任务本质上是I / O绑定的,所以它不应该锁定UI线程。

如果它确实如此,按照最佳实践我会在Task.Run中调用阻塞代码,因为它在那时是CPU绑定代码;将基类更改为任务方法根本不会有任何帮助,因为它在那时在一个单独的线程中运行。

抱歉,浪费时间。