0

私は、すべて.NET 4.0でWPFアプリケーションによって呼び出されるWCFサービス(実際にはいくつか)を持っています。nsoftware(QuickBooks SDK用の.NETラッパーライブラリ)のQuickBooks Integrator 5.0を使用すると、ほとんどのルーチンが正常に機能します。ただし、それらの一部が新しいスレッドから実行され、エラーが発生した場合、特にQuickBooksファイルを開くことができない場合は、SEHExceptionを含むさまざまな奇妙なエラーが発生します。どちらも「無効な引数ステータス」です。 QBUtilities.dllの「util」と「プロシージャエントリポイントが見つかりません」、およびアクセス例外違反。

たとえば、ルーチンがクライアントから直接呼び出された場合、期待どおりに機能します。意図的に間違った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。ヘルプ?

4

1 に答える 1

0

広範囲にわたるデバッグと1日の調査の結果、一度に2つのルーチンを呼び出したときにのみ奇妙なエラーが発生したことがわかりました。これにより、私はいくつかの方法を調査することになりましたが、その中で最も有用なのはこの質問でした。結論として、静的なシングルスレッドの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 に答える