【发布时间】:2012-08-13 01:53:34
【问题描述】:
我有一组正在对其执行写操作的文件,我正在使用Parallel.ForEach 循环来加快速度。
问题是,当我有多个线程时,它的行为就会不稳定。该程序向 WAV 文件写入 10 次 250000 个随机字节,这将导致大约 1.3 秒的静态周期。发生的情况是多线程,在绝大多数文件中,没有任何静态,Windows 指示文件已更改,但音频内容没有,另一个问题是某些剪辑有大约 6 分钟的静态写入它,这是不可能的,代码只向每个文件写入 2500000 个字节(约 10.3 秒),因此由于某种原因,它会将字节写入错误的文件,所以有些没有静态,有些则有一个荒谬的数量。它不可能错过静态,所以它不可能是我。我知道出了点问题。
在我多线程程序之前一切正常,所以我使用了MaxDegreeofParallelism = 1,一切正常,所以我知道问题是由多个线程引起的。
Parallel.ForEach(files, new ParallelOptions{MaxDegreeOfParallelism = 4}, file =>
{
Random rand = new Random();
using (stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))
{
FileInfo info = new FileInfo(file);
for (int i = 0; i < 10; i++)
{
int pos = rand.Next(5000000, Convert.ToInt32(info.Length));
for (int x = 0; x < 250000; x++)
{
byte number = array[rand.Next(array.Length)];
stream.Seek(pos, SeekOrigin.Begin);
pos += 4;
stream.WriteByte(number);
}
}
}
});
编辑:另一个问题是它使用多个线程写入包含关键数据的标题部分,因此没有媒体播放器识别该格式。这只发生在多线程上,我忽略了前 500 万字节,我知道这已经足够了。
编辑:2 更新代码。
谁能解释导致我的代码无法正常运行的多线程是什么?
【问题讨论】:
-
@spender 不是每次迭代都将 pos 增加 4 吗?
-
您实际上并没有显示 Parallel.ForEach() 位。
-
为什么每四个写一个字节?那不是一个通道中的 8 位噪音吗?
-
我已经添加了 Parallel.ForEach 循环的其余部分。我故意一次只写一个频道,这样可以正常工作。
-
我认为 using() 会导致意外行为。在 .NET 框架中,公共语言运行时 (CLR) 会在不再使用对象时自动释放内存。总是有一个线程运行垃圾收集器来执行此操作。 Parallel.ForEach() 和 using() 语句之间存在崩溃
标签: c# .net multithreading plinq parallel-extensions