説明: Type.InvokeMember を使用して、動的に読み込まれたライブラリからメソッドを呼び出しています。場合によっては、このメソッドがハングしてリソースを解放しないことがあります。さらに、メソッドはパラメーターとしてタイムアウトを取りません。
このメソッドのタイムアウトを設定し、バックグラウンドでのメソッドの実行を停止して、次のステップに進むにはどうすればよいですか?
どんな助けでも大歓迎です!
彼の方法論は必要な中止機能を提供するので、@lightbricko に感謝します。
タイムアウトに関する限り、時間を監視し、別のスレッドでソリューションを呼び出すためのラッパー クラスを提供する方が簡単な場合があります。
あなたの質問は、戻り値があるかどうか、または同期性の要件があるかどうかについて言及していません。要件に応じて複雑さが増していくソリューションを紹介します。より複雑な解決策を具体化する必要がある場合は、このスレッドに返信してください。
私のIDEにはありませんので、メモ帳でこれをまとめました。少し汚れていますが、作業するためのスケルトンを提供する必要があります。
メソッドを呼び出すために必要なパラメーターを渡すことができます。ボーナス ポイントについては、Action および Function デリゲートをチェックしてください。:)
public class TimedRemoteInvocation
{
Timer myTimer;
Thread myThread;
public static RemoteInvocationTimer Invoke(..., int timeout)
{
return new RemoteInvocationTimer().InvokeMember(...)
}
private RemoteInvocationTimer InvokeMember( ..., int timeout )
{
myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler( TimeOutOccurred );
myTimer.Interval = timeout; //ex: 200ms
myThread = new Thread(
new ThreadStart(theTypeObj.InvokeMember(...));
myTimer.Start();
mythread.start();
return this;
}
public void ElapsedEventHandler( Object sender, ElapsedEventArgs e )
{
myThread.Abort()
}
}
これを呼び出し元に同期して表示する必要がある場合 (つまり、呼び出し元が完了を待つ必要がある場合) は、私に知らせてください。コードを更新します。アイデアは、呼び出し元がロック ミューテックスを待機することです。そのロックは、最初に TimedRemoteInvocation クラスによって取得され、操作が完了すると解放されます。必要に応じて、さらに詳しい情報を提供できます。
TimedRemoteInvocation caller = TimedRemoteInvocation.Invoke(...)
lock(caller.sharedLock) {}
最後のバリエーションでは、呼び出されたメソッドからの結果が期待されます。これは簡単に取得できますが、その値を呼び出し元に返すには次のいずれかが必要です。
結果を宣言するイベントを処理する呼び出し元
同期が必要な場合は、結果を TimedRemoteInvocation クラスのプロパティに格納できます (ここでもミューテックス ロックを使用する必要があります)。
TimedRemoteInvocation caller = TimedRemoteInvocation.Invoke(...)
res = caller.Result //結果プロパティはミューテックスを取得/待機し、呼び出し元を停止します。
ここで開梱することがたくさんあります。私は物事を詳しく説明していることを知っているので、何か追加する必要がある場合はお知らせください.