私は現在の仕事でC#でコード化されたレガシーライブラリを維持する特権を "獲得"しただけです。私のCOMアセンブリを非同期で呼び出す
このDLL:
- は選択の余地はなく、COMオブジェクトの呼び出しを持っていないのUnifaceで作られた大きなレガシーシステムのための方法を公開します。
- このレガシーシステムと別のシステムのAPIとの間のリンクとして機能します。
- UIのためにWinFormを使用することがあります。
私はコンポーネントを理解してより視覚的に、:
*[Big legacy system in Uniface]*
== [COM] ==>[C# Library]
== [マネージドAPI] ==>*[Big EDM Management System]*
を質問があります:このC#ライブラリのメソッドの1つが実行に時間がかかり、"should"を非同期にする必要があります。
私はC#に慣れていますが、COMにはまったく慣れていません。私はすでに並行プログラミングを行ってきたが、COMは、それまでの複雑さの多くを追加し、すべての私の試験は、これまでに終わるように見えるのいずれかで:
- 一部のみすべての
- マイDllファイルのエラーメッセージなしでクラッシュUIの一部だけを表示して終了しても何もエラーが出ません。
COM DLL内でスレッドを処理する方法についてのアイデアやリソースはありませんヒントや助けを感謝します。
これまでのところ、私は私のメソッドを非同期に行うために変更したコードの最大の一部:
// my public method called by the external system
public int ComparedSearch(string application, out string errMsg) {
errMsg = "";
try {
Action<string> asyncOp = AsyncComparedSearch;
asyncOp.BeginInvoke(application, null, null);
} catch (ex) {
// ...
}
return 0;
}
private int AsyncComparedSearch(string application) {
// my actual method doing the work, that was the called method before
}
任意のヒントや便利なリソースをいただければ幸いです。 ありがとうございます。
UPDATE 1:
は(特にSynchronizationContext
について、およびthis exampleの助けを借りて)以下の答えと手がかりに続いて、私は私のコードをリファクタリングすることができましたし、それが動作するようになっていますが、他から呼び出された場合にのみ、 COMではなく、C#でのウィンドウアプリケーション。 レガシーシステムでは、関数を呼び出すとかなり曖昧なエラーが発生し、クラッシュに関する詳細はわかりません。
UPDATE 2:私の試験で
最新のアップデート:私は、コールがテストプロジェクトから作られていたときに、マルチスレッドを動作させるために、管理、およびのUnifaceシステムからない。 複数の試行の後、私たちのレガシーシステムは現在の設定でうまくマルチスレッドをサポートしていないと考える傾向があります。しかし、それはそれ以上の質問のポイントではありません:)ここ
が動作しているようですコードの抜粋です:
string application;
SynchronizationContext context;
// my public method called by the external system
public int ComparedSearch(string application, out string errMsg) {
this.application = application;
context = WindowsFormsSynchronizationContext.Current;
Thread t = new Thread(new ThreadStart(AsyncComparedSearchAndShowDocs));
t.Start();
errMsg = "";
return 0;
}
private void AsyncComparedSearch() {
// ANY WORK THAT AS NOTHING TO DO WITH UI
context.Send(new SendOrPostCallback(
delegate(object state)
{
// METHODS THAT MANAGE UI SOMEHOW
}
), null);
}
我々は今、これをカプセル化するように、このCOMアセンブリを変更する以外に解決策を検討していますWindowsサービスのライブラリを開き、システムとサービスの間のインターフェイスを作成します。それはより持続可能でなければなりません。
+1このよく組織化された質問です。 – 3yanlis1bos
クラッシュする本当に小さなサンプルを提供できますか?私は本当にそれがクラッシュするために何をしているのかは本当にわかりません:)(あなたのせいか、スレッディングを処理できないレガシーシステムの場合) – Onkelborg
例外は捕まえられない、どんなメッセージも含んでいませんか? –