2013-10-09 22 views
2

描述:我使用Type.InvokeMember調用從動態加載庫的方法。有時候,這個方法會掛起,並且不會釋放它的資源。另外,該方法不會將超時作爲參數。如何設置超時動態加載方法

我如何設置超時這種方法,從在後臺運行停止的方法,並移動到下一個步驟?

任何幫助,將不勝感激!

回答

0

道具@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呼叫者= TimedRemoteInvocation.Invoke(...)
    解析度= caller.Result // result屬性將抓住/等待互斥和停止調用者。

這裏有很多東西需要解壓縮,我知道我對事物有所瞭解,所以讓我知道你是否需要我添加任何東西。

+0

很好的答案!我將在後面實現它。但是,我將更多的工作放入其中,並使用線程實施解決方案。謝謝! –

0

您可以在需要時產生一個新的Threadabort,也可以在需要時創建新的AppDomainunload

使用一個AppDomain提供了更多的隔離。

+0

我已經嘗試使用線程並在給定的時間間隔後中止它。但是,經過充分的調試,它仍然無法正常工作。我會嘗試使用AppDomain並回復你 –