如何为动态加载的方法设置超时时间?

3

描述:我正在使用Type.InvokeMember调用从动态加载的库中调用方法。有时,这个方法会挂起并且不释放它的资源。此外,该方法不接受超时作为参数。

如何为这个方法设置超时,停止后台运行的方法,并继续进行下一步操作?

任何帮助将不胜感激!

2个回答

1

感谢@lightbricko,他的方法将为您提供所需的中止功能。

就超时而言,可能更容易提供一个包装类来监视时间并在单独的线程上调用解决方案。


你的问题没有提到是否有返回值,或者需要同步性。根据要求,我将提出一个解决方案,并根据需求逐渐增加复杂度。如果您需要我详细说明更复杂的解决方案,请在此线程中回复。


我的IDE没有这个功能,所以我在Notepad中编写了这个。虽然有些凌乱,但应该能为你提供一个模板。

你可以传入调用该方法所需的必要参数。如果想获得额外的分数,请查看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 //该结果属性将抓取/等待互斥锁并停止调用者。

这里有很多要解开的问题,我知道我正在概述一些内容,所以如果需要,请让我知道是否需要添加任何内容。


好的答案!我稍后会实现它,只是为了试试。不过,我投入了更多的工作,并使用线程实现了一个解决方案。谢谢! - Raed M

0

你可以创建一个新的线程并在需要时中止它,或者创建一个新的应用程序域并在需要时卸载它。

使用应用程序域提供更多的隔离性。


我已经尝试使用线程并在给定的时间间隔后中止它。然而,经过大量调试,它仍然没有起作用。我将尝试使用AppDomain并回复您。 - Raed M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接