3

説明: Type.InvokeMember を使用して、動的に読み込まれたライブラリからメソッドを呼び出しています。場合によっては、このメソッドがハングしてリソースを解放しないことがあります。さらに、メソッドはパラメーターとしてタイムアウトを取りません。

このメソッドのタイムアウトを設定し、バックグラウンドでのメソッドの実行を停止して、次のステップに進むにはどうすればよいですか?

どんな助けでも大歓迎です!

4

2 に答える 2

1

彼の方法論は必要な中止機能を提供するので、@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) {}

最後のバリエーションでは、呼び出されたメソッドからの結果が期待されます。これは簡単に取得できますが、その値を呼び出し元に返すには次のいずれかが必要です。

  1. 結果を宣言するイベントを処理する呼び出し元

  2. 同期が必要な場合は、結果を TimedRemoteInvocation クラスのプロパティに格納できます (ここでもミューテックス ロックを使用する必要があります)。

    TimedRemoteInvocation caller = TimedRemoteInvocation.Invoke(...)
    res = caller.Result //結果プロパティはミューテックスを取得/待機し、呼び出し元を停止します。

ここで開梱することがたくさんあります。私は物事を詳しく説明していることを知っているので、何か追加する必要がある場合はお知らせください.

于 2013-10-09T23:28:37.287 に答える
0

新しいスレッドを作成して必要に応じて中止するか、新しいAppDomainを作成して必要に応じてアンロードすることができます。

AppDomain を使用すると、分離が強化されます。

于 2013-10-09T22:04:27.327 に答える