1

我有一组文件正在对它们执行写操作,我正在使用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 更新代码。

谁能阐明导致我的代码无法正常运行的多线程是什么?

4

2 回答 2

3

随机数生成器不是线程安全的。Jon Skeet有一篇关于这方面的好文章以及如何制作线程安全的随机数生成器。

于 2012-08-13T02:20:24.327 回答
3

stream在由 执行的委托之外声明Parallel.ForEach。创建的所有线程Parallel.ForEach都在尝试使用相同的变量。由于没有锁定,因此未定义stream每个线程的值 - 您可能会看到多个线程写入同一个流,这会导致您出现奇怪的多线程行为。

尝试删除stream委托外部的声明,并更改

using (stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))

using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))
于 2012-08-13T03:47:24.423 回答