Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在多个线程中写入多个文件,如果所有文件都已写入,则重新安排计时器?_C#_Multithreading - Fatal编程技术网

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

C# 如何在多个线程中写入多个文件,如果所有文件都已写入,则重新安排计时器?,c#,multithreading,C#,Multithreading,在windows窗体C#中,我必须在多个线程中写入多个文件,如果文件已经存在,则覆盖它。完成后,重新安排时间。我需要帮助 public Boolean CreateWriteCSV(string filename,BindingList<Data> data,ItemList us) { bool result = false; try { if data!= null)

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

    }
public Boolean CreateWriteCSV(字符串文件名、BindingList数据、ItemList us)
{
布尔结果=假;
尝试
{
如果数据!=null)
{
//锁(数据)
{
如果(data.Count>0)
{
String contents=String.Empty;
流作者;
使用(FileStream stream=newfilestream(文件名,FileMode.Create,FileAccess.Write,FileShare.Write))
{
//锁(流)
{
writer=新的流writer(流);
writer.WriteLine(contents.TrimEnd(新字符[]{'\r','\n'}));
contents=“X,Y,Z”+Environment.NewLine;
foreach(数据中的数据项)
{
contents+=data.x+”、“+data.y+”、“+data.z+Environment.NewLine;
}
writer.WriteLine(contents.TrimEnd(新字符[]{'\r','\n'}));
writer.Flush();
stream.Close();
///---检查是否创建了文件
///
us.IsExported=真;
锁(并行线程列表)
{
parallelThreadList.Remove(文件名);
}
}
}
}
返回true;
}
}
其他的
{
返回false;
}
}
抓住
{
返回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();
}
Thread[]Thread=新线程[5];
对于(int i=0;i<5;i++)
{
线程[i]=新线程(新线程开始(writeFile));
线程[i].start();
}
..
..
无效写文件(字符串值)
{
Filestream fs=newfilestream(文件名,FileMode.Create,FileAccess.Write);
StreamWriter sw=新StreamWriter(fs);
sw.write(val);
高级关闭();
fs.close();
}
线程函数可以在主线程中转换为do,而无需使用计时器中断用户界面。这将在主线程中运行代码

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();
}
Timer=new Timer();
定时器间隔=5;
列表文本=新列表();
文本。添加(文本1);
文本。添加(文本2);
...
...
计时器刻度(对象发送器、事件参数e)
{
如果(text.count>0)
{
writeFile(文本[0]);
文本。移除(0);
}
其他的
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)
{
    ...
    ...
}

你向我们介绍了你想要实现的目标,并分享了一些代码,但不清楚是什么问题阻碍了你。创建专用线程安全函数
AddCSV(字符串文本)
,在不同线程中准备文本,调用它。问题是这个函数没有写入所有文件,有些文件被跳过。我无法跟踪。。。。