2009-05-13 1 views

ответ

1

BeginExecuteNonQuery не работает?

+1

Это, конечно, в случае с Oracle, что нет BeginExecuteNonQuery. Я не знаю о поставщике данных DB2 .NET. Для Oracle мне приходилось выполнять асинхронную работу. – RichardOD

0

Проблема в том, что нет BeginExecuteNonQuery.

2

Существует несколько способов, которые подходят друг другу, будет зависеть от вашего сценария.

Что я делал в Oracle, я получал 1000 единиц элементов XML из БД на основе очереди идентификаторов рабочих элементов. Получение их в один проход с datareader не сработало, поэтому я получил их по одному на несколько разных потоков (каждый поток получил рабочий элемент из очереди, пока очередь не была пуста). Поскольку каждый отдельный поток получил результат обратно, он помещал XML в очередь производителей-производителей на основе Joseph Albahari's excellent threading tutorial. Отдельный поток смотрел на очередь потребителей-производителей, выполнял преобразования XSL по данным и записывал их в файл - конечно, я сначала тестировал однопоточность, и это было значительно медленнее.

Я попытался с помощью threadpool/asynchronous delegates начать с (как общие рекомендации по резьбе является использование ThreadPool, где это возможно, что делегаты действительно косвенно, а), которые могут работать при условии не более чем на 64 пунктов делать. WaitHandle.WaitAll usually has a limit of 64 work items.. Поскольку у меня было 1000, это не было хорошим вариантом, кроме того, что они делали их в партиях 64, которые казались клочковыми.

Из памяти я изящно выходил из потоков производителей, когда больше не было работы для каждого из них, а затем блокировалось до тех пор, пока очередь потребителей-производителей также не была бы пустой.

Главное, чтобы убедиться, что у вас есть полностью отдельные объекты БД для каждого потока, иначе вы наткнетесь на проблемы с потоками.

Если вы хотите просто выполнить 1 хранимую процедуру асинхронно в приложении Windows/WPF, вы можете посмотреть на использование background worker component.

Дайте мне знать, если вы знаете, нужна ли вам дополнительная информация.

1

Если DB2 не поддерживает BeginExecuteReader, вы можете использовать асинхронные делегаты для выполнения трюка. Функционально это будет одно и то же, за исключением того, что вы сами его реализуете, а не используете что-то встроенное.

Проверьте пример здесь: sql async query problem…

Смежные вопросы