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 //result 属性将在互斥锁上抓取/等待并停止调用者。

这里有很多东西要解压,我知道我在掩饰一些东西,所以如果你需要我添加任何东西,请告诉我。

于 2013-10-09T23:28:37.287 回答
0

您可以生成一个新线程并在需要时中止它,或者您可以创建一个新的AppDomain并在需要时将其卸载

使用 AppDomain 可提供更多隔离。

于 2013-10-09T22:04:27.327 回答