Точка входа AccessExceptionViolation, SEHException и / или процедуры не найдена в QBUtilities.dll при доступе к QuickBooks из службы WCF - PullRequest
0 голосов
/ 27 марта 2011

У меня есть служба WCF (на самом деле несколько), вызываемая приложением WPF, все в .NET 4.0.Используя QuickBooks Integrator 5.0 от nsoftware (библиотека-оболочка .NET для QuickBooks SDK), большинство моих подпрограмм работают нормально.Однако, когда некоторые из них запускаются из нового потока, и возникает ошибка, особенно та, где файл QuickBooks не может быть открыт, тогда я получаю большое количество странных ошибок, в том числе SEHException, оба с недопустимым статусом argutil "and" точка входа в процедуру не найдена "в QBUtilities.dll и нарушение исключения доступа.

Например, подпрограмма, вызываемая напрямую из клиента, работает как положено.Допустим, я намеренно загружаю неправильный файл QuickBooks (то есть QuickBooks не может открыть файл, ожидаемый моим приложением; фатальная ошибка, которую можно отследить) и вызываю его:

GetCustomerWithQB(int CustID)
{
 .. set up code
 ..
 try {
   ..
   ..
   toReturn.QBCustomer.QBCustomer.Get(QuickBooksId); // this goes to QB to do the fetch
 }
 catch (nsoftware.InQB.InQBException x)
 { 
   // we get, correctly, a 602 "there is a different file open" error.
 }
} 

Однако, если я вызываю эту подпрограмму из службы, порождая новую тему:

Task.Factory.StartNew(delegate { GetCustomerWithQB(CustID); });

Тогда я получаю множество ошибок выше.Grrrr.Помощь

1 Ответ

0 голосов
/ 27 марта 2011

После обширной отладки и ежедневных исследований выясняется, что я получал странные ошибки только тогда, когда у меня было ДВУХ подпрограмм, вызывающих одновременно.Это привело меня к исследованию ряда направлений, наиболее полезным из которых был этот вопрос .В итоге я создал статический однопоточный StaTaskScheduler (из библиотеки Parallel Extensions от Microsoft):

_staSchedulerForQBCalls = new StaTaskScheduler(numberOfThreads:1);

и использовал его для всех задач, вызывающих QuickBooks:

Task.Factory.StartNew(delegate { GetCustomerWithQB(CustID); }, CancellationToken.None, TaskCreationOptions.None, _staSchedulerForQBCalls);

Как обычно делают эти вещи, в ретроспективе это кажется достаточно очевидным, но странные ошибки и ограниченные обстоятельства проблем, конечно, сначала не указывали мне в этом направлении.

...