0

我有一个由 WPF 应用程序调用的 WCF 服务(实际上是几个),都在 .NET 4.0 下。使用 nsoftware 的 QuickBooks Integrator 5.0(QuickBooks SDK 的 .NET 包装库),我的大部分例程都可以正常工作。但是,当其中一些从新线程运行时,并且出现错误,尤其是无法打开 QuickBooks 文件的错误时,我会收到各种奇怪的错误,包括 SEHException,两者都是“无效 arg 状态” util”和 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); });

然后我得到了上面的各种错误。GRRR。帮助?

4

1 回答 1

0

经过大量调试和一天的研究后,我发现只有当我同时调用两个例程时才会遇到奇怪的错误。这导致我调查了许多途径,其中最有用的是这个问题。最重要的是,我创建了一个静态单线程 StaTaskScheduler(来自Microsoft 的 Parallel Extensions库):

_staSchedulerForQBCalls = new StaTaskScheduler(numberOfThreads:1);

并将其用于调用 QuickBooks 的所有任务:

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

正如这些事情通常所做的那样,事后看来似乎相当明显,但奇怪的错误和有限的问题环境在一开始肯定没有将我指向这个方向。

于 2011-03-26T23:47:08.760 回答