描述:我正在使用Type.InvokeMember调用从动态加载的库中调用方法。有时,这个方法会挂起并且不释放它的资源。此外,该方法不接受超时作为参数。
如何为这个方法设置超时,停止后台运行的方法,并继续进行下一步操作?
任何帮助将不胜感激!
感谢@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 caller = TimedRemoteInvocation.Invoke(...)
lock(caller.sharedLock) {}
调用者处理声明结果的事件。
如果需要同步,结果可以存储在TimedRemoteInvocation类的属性中(再次需要使用互斥锁)。
TimedRemoteInvocation caller = TimedRemoteInvocation.Invoke(...)
res = caller.Result //该结果属性将抓取/等待互斥锁并停止调用者。
这里有很多要解开的问题,我知道我正在概述一些内容,所以如果需要,请让我知道是否需要添加任何内容。