Добрый вечер, не хочет работать ToArray(), да и вообще ни как не могу использовать результаты выполнения функции, которую я выполняю в пуле потоков.
В дебагере видно, что массив globalOrder содержит элементы, но он их не отдает, ни с помощью .ToArray(), ни перечислением всех объектов, итоговый массив orders просто остается пустым. В чем причина, может кто сталкивался?
p.s. до того, как я поместил её в ThreadPool все работало.
Фрагмент кода:
ProgressbarModal bar1 = new ProgressbarModal();
var timeStart = DateTime.Now;
List
if (obj == null)
{
ThreadPool.QueueUserWorkItem(test.GetOrders, globalOrder);
}
else if (obj is DateTime)
{
var param = new Tuple
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
Комментариев нет:
Отправить комментарий