如何在多个线程中写入多个文件,如果所有文件都已写入,则重新安排计时器

本文关键字:文件 新安排 计时器 如果 线程 | 更新日期: 2023-09-27 18:31:59

在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;
        }           
    }

如何在多个线程中写入多个文件,如果所有文件都已写入,则重新安排计时器

有时线程对某些项目的行为很奇怪。特别是在 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();
}

线程函数可以在主线程中转换为 do,而不会使用 timer 中断用户界面。这将在主线程中运行代码。

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的情况下一样,当使用线程操作大型数据时,您可以看到许多数据丢失和滚动条被隐藏。使用主线程将解决问题。

如果您使用线程的局部变量并在完成其操作之前再次重用它,则可能会出现丢失某些文件的情况。

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)
{
    ...
    ...
}