【发布时间】:2015-06-24 07:49:15
【问题描述】:
我正在尝试将字符串列表保存到多个文件中,每个字符串在不同的文件中,并同时进行。我是这样做的:
public async Task SaveToFilesAsync(string path, List<string> list, CancellationToken ct)
{
int count = 0;
foreach (var str in list)
{
string fullPath = path + @"\" + count.ToString() + "_element.txt";
using (var sw = File.CreateText(fullPath))
{
await sw.WriteLineAsync(str);
}
count++;
NLog.Trace("Saved in thread: {0} to {1}",
Environment.CurrentManagedThreadId,
fullPath);
if (ct.IsCancellationRequested)
ct.ThrowIfCancellationRequested();
}
}
然后这样称呼它:
try
{
var savingToFilesTask = SaveToFilesAsync(@"D:\Test", myListOfString, ct);
}
catch(OperationCanceledException)
{
NLog.Info("Operation has been cancelled by user.");
}
但是在日志文件中我可以清楚地看到保存总是发生在同一个线程 id 中,所以没有并行性?我究竟做错了什么?如何解决?我的目标是使用所有计算机内核尽可能快地节省所有费用。
【问题讨论】:
-
你的操作是异步运行的,但不是并行的,是有区别的。您可以并行化循环,但我认为它不会产生任何改进 - 您的操作不受 CPU 限制,而是 IO 限制...
-
您的 CPU 不太可能成为瓶颈。 I/O 慢了几个数量级。无需为此并行化,只有在使用机械硬盘驱动器时才会减慢处理速度。
-
您在运行 GUI 应用程序吗?
-
@YuvalItzchakov 不,这是一个控制台应用程序
标签: c# .net multithreading task-parallel-library