私は実行に時間がかかり、多くのデータベース操作を伴うメソッドを持っています。タイムアウト可能なメソッド内でこれらのメソッドをラップしたいので、一定時間内にコールバックが発生しなかった場合は、ロールバックします。どのようにC#でタイムアウト可能なメソッドを書く
私は使用しているサードパーティのCOMオブジェクトがバックグラウンドスレッドで実行できないため、メインスレッドでのみメソッドを実行する必要があります。
どのような提案も高く評価されます。
に関して、
Bibek Dawadi
私は実行に時間がかかり、多くのデータベース操作を伴うメソッドを持っています。タイムアウト可能なメソッド内でこれらのメソッドをラップしたいので、一定時間内にコールバックが発生しなかった場合は、ロールバックします。どのようにC#でタイムアウト可能なメソッドを書く
私は使用しているサードパーティのCOMオブジェクトがバックグラウンドスレッドで実行できないため、メインスレッドでのみメソッドを実行する必要があります。
どのような提案も高く評価されます。
に関して、
Bibek Dawadi
私はThread.Abort()の代わりにThread.Interrupt()を使用したことを除いて、メインスレッドにやや親切であると思っていたのと同様の解決策をまとめました。問題は、Thread.Interrupt()がブロックされている呼び出しを中断しないため、多くの場合、不満足であることです。 Thread.Abort()は危険な呼び出しであり、可能な場合は避けるべきです。あなたの毒を選ぶ。誰かがより良いを持っていない限り
AbortableProc.Execute(
() => { Process(kStarting); Process(kWorking); Process(kCleaningUp); },
() => { if (IsWorking()) CleanUp(); }
};
はこれが助ける必要があります。
あなたがメインスレッドで実行することが必要と述べたまで私はあなたと一緒でした。私はそれがあなたの描写の方法であるとは思わない。
問題は、タイミングと実際の作業を実行するために少なくとも2つのスレッドが必要であり、どちらもメインスレッドではないことです。タイマーはメインスレッドを使用しないためです。操作を終了させたい場合は、メインスレッドがアプリケーション全体をシャットダウンする場合は、この操作を終了します。これを行う方法は、メインスレッドから実行されるラッパークラスを設定し、タイマーだけでなく操作のバックグラウンドスレッドも設定することです。
なぜ、第三者のライブラリをメインスレッドから呼び出さなければならないのですか?
メインスレッドで重い持ち上げが可能ですが、可能であれば避けるべきです。しかし、メインスレッドが常に自分自身をチェックしていない限り、別のスレッドが本当に必要です。 – Telavian
私はOutook APIを使用していますが、バックグラウンドスレッドから呼び出されたときに一貫して動作しない方法もあります。マイクロソフトのサポートは、メインスレッドのみからAPIを呼び出すことをお勧めし、それは今私のために働いていると私は他のオプションを持っていない。 – Bikswan
Actaully、私はマスター/スレーブ分散システムで作業しています。マスターはスレーブにジョブを割り当てますが、スレーブがジョブマスターを終了できない場合は予測された間隔の後にスレーブに何らかのエラーが発生したと想定し、タイムアウト可能なメソッドでなければ、プログラミングの世界ではどんなオプションも利用可能かどうかは分かりません。 – Bikswan
:あなたは、このモードでそれを使用することができるように、にやにや笑いのために
、私はtimeoutActionに入れる:何が価値があるのは、これは私の実装であるために
アイデアは、私は、メソッド属性が順序にあると思うだろう。それ以外の場合は、タイマーまたは他の設計提案を使用してタスクを実行します。 – IAbstract