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