我有以下功能,可单独运行数千个文件。在运行时,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(); }
}
答案 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工作上。