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