2011-03-26 5 views
0

.NET 4.0에서 WPF 응용 프로그램에서 호출하는 WCF 서비스가 여러 개 있습니다. QuickBooks Integrator 5.0을 nsoftware (QuickBooks SDK 용 .NET 래퍼 라이브러리)를 사용하면 대부분의 루틴이 정상적으로 작동합니다. 그러나, 그들 중 일부는 새로운 스레드에서 실행하고 거기에 오류, 특히 QuickBooks 파일을 열 수없는 하나의 경우, 나는 SEHException을 포함한 다양한 이상한 오류를 모두 "잘못된 arg 상태 util "및"프로 시저 엔트리 포인트를 찾을 수 없습니다 "QBUtilities.dll 및 액세스 예외 위반.WCF 서비스에서 QuickBooks에 액세스 할 때 AccessExceptionViolation, SEHException 및/또는 Procedure 엔트리 포인트가 QBUtilities.dll에 없습니다.

예를 들어, 클라이언트에서 직접 호출 한 루틴은 예상대로 작동합니다.

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. 
} 
} 

을하지만, 내가 서비스, 산란 내에서 해당 루틴을 호출하는 경우 : 그것을 전화;의 내가 의도적으로 잘못된 QuickBooks에 파일을로드 (치명적인 트랩 가능한 오류 의미 QuickBooks에 내 응용 프로그램이 기대되는 파일을 열 수 없습니다) 가정 해 봅시다 새 스레드 :

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

그러면 위의 다양한 오류가 발생합니다. GRRRR. 도움?

답변

0

광범위한 디버깅과 하루의 연구 끝에, 두 번의 루틴을 동시에 호출 할 때 이상한 오류가 발생하는 것으로 나타났습니다. 이로 인해 많은 길을 조사 할 수 있었는데 그 중 가장 유용한 것은 this question이었습니다. 결론은, 내가합니다 (Microsoft's Parallel Extensions 라이브러리) 정적 단일 스레드 StaTaskScheduler 생성 :

_staSchedulerForQBCalls = new StaTaskScheduler(numberOfThreads:1); 

을하고 모든 작업이 QuickBooks에 호출을 위해 그것을 사용 :

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

이러한 일들이 일반적으로하는 것처럼를 보인다 뒤늦은 지경에서 합리적으로 명백하지만 문제의 기괴한 오류와 제한된 상황은 처음에는이 방향으로 나를 가리 키지 않았다.

관련 문제