0

Windows フォーム C# では、複数のスレッドで複数のファイルを書き込む必要があり、ファイルが既に存在する場合は上書きします。すべてが終わったら、時間を再スケジュールします。助けが必要..

    public Boolean CreateWriteCSV(string filename,BindingList<Data> data,ItemList us)
    {
        bool result = false;
        try
        {
            if data!= null)
            {
             //   lock (data)
                {
                    if (data.Count > 0)
                    {
                        String contents = string.Empty;
                        StreamWriter writer;


                        using (FileStream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Write))
                        {
                          //  lock (stream)
                            {
                                writer = new StreamWriter(stream);

                                writer.WriteLine(contents.TrimEnd(new char[] { '\r', '\n' }));

                                contents = "X,Y,Z"+Environment.NewLine;

                                foreach (Data item in data)
                                {
                                    contents += data.x+","+data.y+","+data.z+ Environment.NewLine;
                                }

                                writer.WriteLine(contents.TrimEnd(new char[] { '\r', '\n' }));
                                writer.Flush();
                                stream.Close();

                                ///---check to see file created or not
                                ///
                                us.IsExported = true;

                                lock (parallelThreadList)
                                {
                                    parallelThreadList.Remove(filename);
                                }
                            }
                        }
                    }

                   return  true;


                }
            }
            else
            {
                return  false;


            }
        }
        catch
        {
           return  false;
        }           

    }
4

2 に答える 2

1

スレッドのローカル変数を使用し、操作が完了する前に再利用すると、一部のファイルが欠落するなどの状況が発生する可能性があります。

Thread thread;

void createFilesAsync()
{
    thread = new Thread(new ThreadStart(createFile);
    thread.start();
}

createFile(string val)
{
    ...
    ...
}

このようにすると、操作が完了する前にスレッドが中断され、別のファイルが再作成されます..この場合、リストの最後のファイルが中断することなく作成され、他のいくつかのファイルが作成され、いくつかのファイルは作成されません..

関数内に変数を作成することでこれを解決します。

void createFilesAsync()
{
    Thread thread = new Thread(new ThreadStart(createFile);
    thread.start();
}

createFile(string val)
{
    ...
    ...
}
于 2013-09-19T07:46:05.143 に答える
1

アイテムによってはスレッドの挙動がおかしくなることがあります。特に、DataGridView でファイルを書き込んだり、大きなデータにアクセスしたりするとき。今回はメインスレッドでタイマーを使用しています..

例:

Thread[] thread = new Thread[5];
for (int i = 0; i < 5; i++)
{
    thread[i] = new Thread(new ThreadStart(writeFile));
    thread[i].start();
}

..
..

void writeFile(string val)
{
    Filestream fs = new Filestream(fileName, FileMode.Create, FileAccess.Write);
    StreamWriter sw = new StreamWriter(fs);
    sw.write(val);
    sr.close();
    fs.close();
}

スレッド関数は、Timer を使用して UserInterface を中断することなく、メイン スレッドで実行するように変換できます。これにより、コードがメイン スレッドで実行されます。

Timer timer = new Timer();
timer.interval = 5;
List<string> texts = new List<string>();
texts.add(text1);
texts.add(text2);
...
...
timer_Tick(object sender, EventArgs e)
{
    if (texts.count > 0)
    {
        writeFile(texts[0]);
        texts.RemoveAt(0);
    }
    else
        timer.stop();
}

いくつかのことは、メインスレッド自体が正しく機能することを必要とします。DataGridView の場合と同様に、スレッドを使用して大きなデータを操作すると、多くのデータが欠落し、スクロールバーが非表示になることがわかります.メイン スレッドを使用すると、問題が解決します..

于 2013-09-19T07:31:08.670 に答える