写入Excel使用Thread错过了一些数据

时间:2015-12-19 18:40:26

标签: c# excel multithreading kinect

我正在使用Kinect v2来录制并对主题骨架进行一些计算,这是一项耗时的任务。我还同时将有关骨架的数据写入Excel工作表,冻结软件。结果,我使用Thread来处理Excel编写任务。它运行顺利,但问题是,当我写入Excel工作表时,它会错过一些单元格,如图所示。有什么建议吗?

enter image description here

 testThreadStart11 = new ThreadStart(excelwriter);
 testThread11 = new Thread(testThreadStart11) { IsBackground = true };
 testThread11.Start();


 public void excelwriter()
 {
      _excelWorksheet.Cells[_excelCol, 1] = _excelRowNum;
      _excelWorksheet.Cells[_excelCol, 2] = limb1.ToString();
      _excelWorksheet.Cells[_excelCol, 3] = limb2.ToString();
      _excelCol++;
      _excelRowNum++;
 }

2 个答案:

答案 0 :(得分:2)

在主线程中存储队列中的所有值,并且只有一个后台线程将此队列中的值写入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();
        }
    }

答案 1 :(得分:1)

您的代码看起来像是在每行启动一个帖子,并在您的班级中保持状态。

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