晚上好,它不想工作ToArray()
,一般我不能使用我在线程池中执行的函数的执行结果。在调试器中,您可以看到数组globalOrder
包含元素,但它不返回它们,无论是在所有对象的帮助.ToArray()
下还是通过枚举所有对象,结果数组都orders
保持为空。是什么原因,有没有人遇到过?
ps 在我将它放入 ThreadPool 之前一切正常。
代码片段:
ProgressbarModal bar1 = new ProgressbarModal();
var timeStart = DateTime.Now;
List<Order> globalOrder = new List<Order>();
if (obj == null)
{
ThreadPool.QueueUserWorkItem(test.GetOrders, globalOrder);
}
else if (obj is DateTime)
{
var param = new Tuple<DateTime, List<Order>>((DateTime)obj, globalOrder);
ThreadPool.QueueUserWorkItem(test.GetOrders1, param);
}
else if (obj is DateTime[])
{
var param = new Tuple<DateTime[], List<Order>>((DateTime[])obj, globalOrder);
ThreadPool.QueueUserWorkItem(test.GetOrders2, param);
}
else if(obj is Int32)
{
var param = new Tuple<Int32, List<Order>>((Int32)obj, globalOrder);
ThreadPool.QueueUserWorkItem(test.GetOrders3, param);
}
else
{
return;
}
bar1.ShowDialog();
// Вот тут проблема, на точке останова, я вижу, что globalOrder
// содержит 3000+ объектов, но массив orders так и остается пустой
Order[] orders = globalOrder.ToArray();
ProgressbarModal bar = new ProgressbarModal();
ThreadPool.QueueUserWorkItem(OrdersWorker.Insert, orders);
bar.ShowDialog();
ThreadPool.QueueUserWorkItem()
表示该方法应该在池线程上执行。在此调用之后,程序继续运行。这意味着当您访问列表时globalOrder
,它还没有来得及填满。你需要重新考虑你在做什么,也许等待函数完成运行GetOrders
。此外,值得使用线程安全的集合(例如
ConcurrentBag<T>
),否则,当从一个流写入并从另一个流读取时,可能会出现错误和/或接收不一致的数据。如果您正在等待线程完成运行,这将不是必需的。