描述:我正在使用Type.InvokeMember从动态加载的库中调用方法。有时,此方法会挂起并且不会释放其资源。此外,该方法不会将超时作为参数。
如何为此方法设置超时,停止在后台运行该方法,然后继续下一步?
任何帮助将不胜感激!
答案 0 :(得分:0)
答案 1 :(得分:0)
支持@lightbricko,因为他的方法将为您提供所需的中止功能。
就超时而言,提供一个包装类来监视时间并在单独的线程上调用解决方案可能更容易。
您的问题未提及是否存在返回值或同步性要求。我会根据需求提出一个复杂程度越来越高的解决方案。如果您需要我充实更复杂的解决方案,请回复此主题。
不在我的IDE中,所以我在记事本中掀起了这个。它有点脏,但应该给你一个骨架来工作。
您可以传入调用方法所需的参数。奖励积分请查看行动和职能代表! :)
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 //结果属性将获取/等待互斥锁并停止调用者。
这里有很多需要解开的东西,我知道我正在掩饰事物,所以如果你需要我添加任何内容,请告诉我。