Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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# 使用线程写入Excel会丢失一些数据_C#_Excel_Multithreading_Kinect - Fatal编程技术网

C# 使用线程写入Excel会丢失一些数据

C# 使用线程写入Excel会丢失一些数据,c#,excel,multithreading,kinect,C#,Excel,Multithreading,Kinect,我正在使用Kinect v2记录和计算受试者的骨架,这是一项耗时的任务。我还将有关骨架的数据同时写入Excel表格,从而冻结软件。因此,我使用线程来处理Excel的编写任务。它运行平稳,但问题是当我写入Excel工作表时,它遗漏了一些单元格,如图所示。有什么建议吗 您的代码看起来像是每行启动一个线程,并在类中保持状态 如果没有适当的线程同步,这将不起作用。其他线程将在运行时修改_excelCol和_excelRowNum。如果您只需要卸载UI线程,请考虑启动一个新线程。或者,在修改状态周围添加

我正在使用Kinect v2记录和计算受试者的骨架,这是一项耗时的任务。我还将有关骨架的数据同时写入Excel表格,从而冻结软件。因此,我使用线程来处理Excel的编写任务。它运行平稳,但问题是当我写入Excel工作表时,它遗漏了一些单元格,如图所示。有什么建议吗


您的代码看起来像是每行启动一个线程,并在类中保持状态


如果没有适当的线程同步,这将不起作用。其他线程将在运行时修改_excelCol和_excelRowNum。如果您只需要卸载UI线程,请考虑启动一个新线程。或者,在修改状态周围添加适当的锁定。

在主线程中将所有值存储到队列中,并且仅在一个后台线程中将此队列中的值写入excel

示例代码:

    class Data
    {
        public int C1 { get; set; }
        public int C2 { get; set; }
        public int C3 { get; set; }
    }

    class Program
    {
        static Queue<Data> RowsDataQueue = new Queue<Data>();
        static void Main(string[] args)
        {
            ThreadStart testThreadStart11 = new ThreadStart(excelwriter);
            Thread testThread11 = new Thread(testThreadStart11) { IsBackground = true };
            testThread11.Start();
            while (true)
            {
                Data RowData = ReadDataFromSomeWhere();
                RowsDataQueue.Enqueue(RowData);
            }
        }

        public static void excelwriter()
        {
            while (true)
            {
                if (RowsDataQueue.Count > 0)
                {
                    Data D = RowsDataQueue.Dequeue();
                    //write values in the D to the excel file...
                }
            }
        }

        private static Data ReadDataFromSomeWhere()
        {
            throw new NotImplementedException();
        }
    }
类数据
{
公共int C1{get;set;}
公共int C2{get;set;}
公共int C3{get;set;}
}
班级计划
{
静态队列RowsDataQueue=新队列();
静态void Main(字符串[]参数)
{
ThreadStart testThreadStart11=新的ThreadStart(excelwriter);
线程testThread11=新线程(testThreadStart11){IsBackground=true};
testThread11.Start();
while(true)
{
Data RowData=readdatafromwhere();
RowsDataQueue.Enqueue(RowData);
}
}
publicstaticvoidexcelwriter()
{
while(true)
{
如果(RowsDataQueue.Count>0)
{
数据D=RowsDataQueue.Dequeue();
//将D中的值写入excel文件。。。
}
}
}
私有静态数据readDataFromwhere()
{
抛出新的NotImplementedException();
}
}

我只想卸载您提到的UI。你能告诉我我应该改变什么吗?考虑到你的代码很小,很难说清楚。但是,概括地说,如果您有testThread.Start,则从循环内部开始,将其移出循环外部。你只需要一根线。如果不确定,请尝试在线程开始()处设置断点;呼叫
    class Data
    {
        public int C1 { get; set; }
        public int C2 { get; set; }
        public int C3 { get; set; }
    }

    class Program
    {
        static Queue<Data> RowsDataQueue = new Queue<Data>();
        static void Main(string[] args)
        {
            ThreadStart testThreadStart11 = new ThreadStart(excelwriter);
            Thread testThread11 = new Thread(testThreadStart11) { IsBackground = true };
            testThread11.Start();
            while (true)
            {
                Data RowData = ReadDataFromSomeWhere();
                RowsDataQueue.Enqueue(RowData);
            }
        }

        public static void excelwriter()
        {
            while (true)
            {
                if (RowsDataQueue.Count > 0)
                {
                    Data D = RowsDataQueue.Dequeue();
                    //write values in the D to the excel file...
                }
            }
        }

        private static Data ReadDataFromSomeWhere()
        {
            throw new NotImplementedException();
        }
    }