我正在使用Kinect v2来录制并对主题骨架进行一些计算,这是一项耗时的任务。我还同时将有关骨架的数据写入Excel工作表,冻结软件。结果,我使用Thread来处理Excel编写任务。它运行顺利,但问题是,当我写入Excel工作表时,它会错过一些单元格,如图所示。有什么建议吗?
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++;
}
答案 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线程,请考虑只启动一个新线程。或者在修改状态周围添加适当的锁定。