2011-02-07 2 views
2

私は実行に時間がかかり、多くのデータベース操作を伴うメソッドを持っています。タイムアウト可能なメソッド内でこれらのメソッドをラップしたいので、一定時間内にコールバックが発生しなかった場合は、ロールバックします。どのようにC#でタイムアウト可能なメソッドを書く

私は使用しているサードパーティのCOMオブジェクトがバックグラウンドスレッドで実行できないため、メインスレッドでのみメソッドを実行する必要があります。

どのような提案も高く評価されます。

に関して、

Bibek Dawadi

+0

:あなたは、このモードでそれを使用することができるように、にやにや笑いのために

public static class AbortableProc { public static void Execute(Action action, Action timeoutAction, int milli) { Thread currThread = Thread.CurrentThread; object stoppedLock = new object(); bool stopped = false; bool interrupted = false; Thread timer = new Thread(() => { Thread.Sleep(milli); lock (stoppedLock) { if (!stopped) { currThread.Interrupt(); stopped = true; interrupted = true; } } }); timer.Start(); try { action(); lock (stoppedLock) { stopped = true; } } catch (ThreadInterruptedException) { } if (interrupted) { timeoutAction(); } } } 

、私はtimeoutActionに入れる:何が価値があるのは、これは私の実装であるために

アイデアは、私は、メソッド属性が順序にある​​と思うだろう。それ以外の場合は、タイマーまたは他の設計提案を使用してタスクを実行します。 – IAbstract

答えて

1

私はThread.Abort()の代わりにThread.Interrupt()を使用したことを除いて、メインスレッドにやや親切であると思っていたのと同様の解決策をまとめました。問題は、Thread.Interrupt()がブロックされている呼び出しを中断しないため、多くの場合、不満足であることです。 Thread.Abort()は危険な呼び出しであり、可能な場合は避けるべきです。あなたの毒を選ぶ。誰かがより良いを持っていない限り

AbortableProc.Execute(
    () => { Process(kStarting); Process(kWorking); Process(kCleaningUp); }, 
    () => { if (IsWorking()) CleanUp(); } 
}; 
2

はこれが助ける必要があります。

Implement C# Generic Timeout

+0

(背景)スレッドとThread.Abort()を使用する点を除きます。 –

+0

これは、他のスレッドを使用せずに、またはメインスレッドが定期的にそれ自身をチェックすることなしには不可能です。 – Telavian

+1

メインスレッドはどのように「自分自身をチェックする」でしょうか?サードパーティのDLLを実行するとブロックされます。 – KeithS

1

あなたがメインスレッドで実行することが必要と述べたまで私はあなたと一緒でした。私はそれがあなたの描写の方法であるとは思わない。

問題は、タイミングと実際の作業を実行するために少なくとも2つのスレッドが必要であり、どちらもメインスレッドではないことです。タイマーはメインスレッドを使用しないためです。操作を終了させたい場合は、メインスレッドがアプリケーション全体をシャットダウンする場合は、この操作を終了します。これを行う方法は、メインスレッドから実行されるラッパークラスを設定し、タイマーだけでなく操作のバックグラウンドスレッドも設定することです。

なぜ、第三者のライブラリをメインスレッドから呼び出さなければならないのですか?

+0

メインスレッドで重い持ち上げが可能ですが、可能であれば避けるべきです。しかし、メインスレッドが常に自分自身をチェックしていない限り、別のスレッドが本当に必要です。 – Telavian

+0

私はOutook APIを使用していますが、バックグラウンドスレッドから呼び出されたときに一貫して動作しない方法もあります。マイクロソフトのサポートは、メインスレッドのみからAPIを呼び出すことをお勧めし、それは今私のために働いていると私は他のオプションを持っていない。 – Bikswan

+0

Actaully、私はマスター/スレーブ分散システムで作業しています。マスターはスレーブにジョブを割り当てますが、スレーブがジョブマスターを終了できない場合は予測された間隔の後にスレーブに何らかのエラーが発生したと想定し、タイムアウト可能なメソッドでなければ、プログラミングの世界ではどんなオプションも利用可能かどうかは分かりません。 – Bikswan

関連する問題