我应该对运行多次的函数使用异步吗?

时间:2018-10-16 21:55:40

标签: c# asynchronous io

我有以下功能,可单独运行数千个文件。在运行时,UI线程由于同步I / O操作而锁定。但是this消息人士说,对许多操作使用异步操作效率低下,那么如何防止UI锁定呢?

public string CopyFile(string sourceFile, string fileName, bool forceCopy)
    {
        fileName = GetSafePathname(GetSafeFilename(fileName));
        string DestinationFile = Path.Combine(DestinationFolder, fileName);

        if (File.Exists(DestinationFile) && !forceCopy)
        {
           return DestinationFile = null;
        }

        else if (!File.Exists(DestinationFile)) //copy the file if it does not exist at the destination
        {
            File.Copy(sourceFile, DestinationFile);
            return DestinationFile;
        }

        else if (forceCopy) //if forceCopy, then delete the destination file and copy the new one in its place
        {
            File.Delete(DestinationFile);
            File.Copy(sourceFile, DestinationFile);
            return DestinationFile;
        }

        else { throw new GenericException(); }
    }

1 个答案:

答案 0 :(得分:0)

要弄清楚多任务处理是否有用,您首先需要了解瓶颈在哪里。毫无疑问,文件系统或文件操作的瓶颈将是磁盘。

现在必须最小化Multtiasking才能使GUI保持响应。即使只是一个备用线程或将循环移入异步函数。

在某种程度上,多任务处理甚至可以使处理量受益:尽管当前一项任务使CPU负担了一些前工作或后工作,但另一项任务可能正在写。

但是管理许多操作也要花费资源。迟早必须管理所有这些操作的负担将消耗所有收益。 Paralell减速设置为: https://en.wikipedia.org/wiki/Parallel_slowdown

只有几个操作令人愉悦/难以置信。对于他们来说,多线程速度下降的时间很晚,甚至永远不会:https://en.wikipedia.org/wiki/Embarrassingly_parallel您的情况无疑是其中之一。实际上,您可以将Paralell Slowdown设置为非常快。

编辑:

举一个数学例子,让我们假设每个文件操作花费10毫秒的CPU工作,200毫秒的读/写工作。

如果您在单个线程中按顺序运行它而不对200个文件进行多任务处理,那将是(200 + 10)* 200 ms或42秒(我发誓我没有计划)。

如果使用异步,则在另一项操作的写入过程中,一个或多个操作可能会运行其10毫秒的CPU工作。因此,除了最后一个文件和第一个文件外,所有文件都将被忽略。因此突然是:(200 * 200)+10毫秒或40.01秒。节省将近2秒。

现在开始运行许多基本上会增加每个服务器的平均CPU时间。找出最常见的开销通常应该立即获得CPU时间。到平均平均开销接近1900 ms的那一刻,您就回到了42秒。而且,如果在那之后添加更多内容,那么开销实际上将导致比实际写入工作花费更多的时间在CPU工作上。