none
在复制内存时检测到可能的 I/O 争用条件。默认情况下,I/O 包不是线程安全的。在多线程应用程序中,必须以线程安全方式(如 TextReader 或 TextWriter 的 Synchronized 方法返回的线程安全包装)访问流。这也适用于 StreamWriter 和 StreamReader 这样的类。 RRS feed

  • 问题

  • public Form1()
            {
                InitializeComponent();
                int time = 0;
                int.TryParse(textBox1.Text, out time);
                Stopwatch sw = new Stopwatch();
                sw.Start();
                string filePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"cp.bin";//设置路径
                using (FileStream fs = File.Create(filePath))//优化
                    {
                        double t0 = 0, f0 = 100000, t1 = 1.048576 * 4, f1 = 1000000;
                        double beta = (f1 - f0) / t1;
                        double chirp = 0;
                    Parallel.For(0, 167772160, (i) =>
                         {
                             t0 += 2.5 * Math.Pow(10, -8);
                             chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
                             chirp = Math.Round(chirp * 2046);
                             chirp = chirp * 2 + 2046;
                             byte[] b = Encoding.Unicode.GetBytes(chirp.ToString());
                             fs.Write(b, 0, b.Length);
                         });
                }
                sw.Stop();
               textBox1.Text ="耗时为:  " +sw.ElapsedMilliseconds.ToString()+"  ms";
            }
    

    错误信息:在复制内存时检测到可能的 I/O 争用条件。默认情况下,I/O 包不是线程安全的。在多线程应用程序中,必须以线程安全方式(如 TextReader 或 TextWriter 的 Synchronized 方法返回的线程安全包装)访问流。这也适用于 StreamWriter 和 StreamReader 这样的类。

    运行的时候会出现这样的错误,该如何解决呢,我不太懂Parallel.For并行运算,谢谢啊,急等

    2017年9月20日 2:56

答案


  • Hi Believer6644,

    从你的错误信息看,你需要使用内置的 Syncronized TextReader/Writer类。你可以尝试修改你的代码如下:

              Stopwatch sw = new Stopwatch();
                sw.Start();
                string filePath = @"D:\cp.bin";// 
                using (FileStream fs = File.Create(filePath))// 
                {
                    StreamWriter ObjWrites = default(StreamWriter);
                    ObjWrites = new StreamWriter(fs);
                    dynamic synws = StreamWriter.Synchronized(ObjWrites);
    
                    double t0 = 0, f0 = 100000, t1 = 1.048576 * 4, f1 = 1000000;
                    double beta = (f1 - f0) / t1;
                    double chirp = 0;
                    Parallel.For(0, 1677, (i) =>
                    {
                        t0 += 2.5 * Math.Pow(10, -8);
                        chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
                        chirp = Math.Round(chirp * 2046);
                        chirp = chirp * 2 + 2046;
    
                        //byte[] b = Encoding.Unicode.GetBytes(chirp.ToString());
                        //synws.Write(b, 0, b.Length);
                        synws.Write(chirp.ToString());
    
    
                    });
                    synws.Close();
                    ObjWrites.Close();
                }
                sw.Stop();
                MessageBox.Show("耗时为:  " + sw.ElapsedMilliseconds.ToString() + "  ms");

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月20日 6:11
    版主

全部回复

  • Parallel.For改成for或者foreach循环

    please verify my account

    2017年9月20日 3:11

  • Hi Believer6644,

    从你的错误信息看,你需要使用内置的 Syncronized TextReader/Writer类。你可以尝试修改你的代码如下:

              Stopwatch sw = new Stopwatch();
                sw.Start();
                string filePath = @"D:\cp.bin";// 
                using (FileStream fs = File.Create(filePath))// 
                {
                    StreamWriter ObjWrites = default(StreamWriter);
                    ObjWrites = new StreamWriter(fs);
                    dynamic synws = StreamWriter.Synchronized(ObjWrites);
    
                    double t0 = 0, f0 = 100000, t1 = 1.048576 * 4, f1 = 1000000;
                    double beta = (f1 - f0) / t1;
                    double chirp = 0;
                    Parallel.For(0, 1677, (i) =>
                    {
                        t0 += 2.5 * Math.Pow(10, -8);
                        chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
                        chirp = Math.Round(chirp * 2046);
                        chirp = chirp * 2 + 2046;
    
                        //byte[] b = Encoding.Unicode.GetBytes(chirp.ToString());
                        //synws.Write(b, 0, b.Length);
                        synws.Write(chirp.ToString());
    
    
                    });
                    synws.Close();
                    ObjWrites.Close();
                }
                sw.Stop();
                MessageBox.Show("耗时为:  " + sw.ElapsedMilliseconds.ToString() + "  ms");

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月20日 6:11
    版主
  • 但是为什么生成的文件大小减半了呢,之前是1.29G,现在是660M
    2017年9月20日 6:54

  • Hi Believer6644,

    >>但是为什么生成的文件大小减半了呢,之前是1.29G,现在是660M

    我这边测试过了,那是不同编码格式引起的问题。你这边byte[]的大小正好是char[]的2倍左右。但是文本保存的内容是一样的。你将byte 改成UTF8格式获取,大小就应该一样了。

      byte[] b = Encoding.UTF8.GetBytes(chirp.ToString());
    

    Unicode(UTF-8, UTF-16)令人混淆的概念:
    http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html

    注意:此回复包含对第三方万维网站点的引用。 微软正在为您提供这方面的信息。 Microsoft不控制这些网站,并没有测试这些网站上发现的任何软件或信息; 因此,Microsoft不能对在那里发现的任何软件或信息的质量,安全性或适用性做任何陈述。 使用互联网上发现的任何软件都存在固有的危险,微软警告您确保在从因特网检索任何软件之前,您完全了解风险。

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月20日 9:02
    版主