2011-02-07 31 views
2

我有一些方法需要較長的時間來執行並涉及大量的數據庫操作。我想在可超時的方法中包裝這些方法,以便如果它在不變的時間內沒有回調,我會回滾。如何在C#中編寫超時方法

有沒有辦法做到這一點,我也必須在主線程中運行方法只是因爲我使用的第三方COM對象無法在後臺線程中執行。

任何類型的建議將不勝感激。

問候,

Bibek Dawadi

+0

除非有人有更好的想法,我會認爲一個方法屬性可能是有序的。否則,定時器或其他設計建議的任務。 – IAbstract 2011-02-07 21:29:34

回答

1

我敲了一個類似於鏈接到的解決方案,除了我使用Thread.Interrupt()而不是Thread.Abort(),認爲這對主線程來說會更友善些。問題在於Thread.Interrupt()不會中斷被阻塞的呼叫,所以在許多情況下它並不令人滿意。 Thread.Abort()是一個危險的調用,應儘可能避免。選擇你的毒藥。

對於它的價值,這是我實現:

public static class AbortableProc 
{ 

    public static void Execute(Action action, Action timeoutAction, int milli) 
    { 
     Thread currThread = Thread.CurrentThread; 
     object stoppedLock = new object(); 
     bool stopped = false; 
     bool interrupted = false; 

     Thread timer = new Thread(() => 
     { 
      Thread.Sleep(milli); 
      lock (stoppedLock) 
      { 
       if (!stopped) 
       { 
        currThread.Interrupt(); 
        stopped = true; 
        interrupted = true; 
       } 
      } 
     }); 
     timer.Start(); 

     try 
     { 
      action(); 
      lock (stoppedLock) 
      { 
       stopped = true; 
      } 
     } 
     catch (ThreadInterruptedException) 
     { 
     } 
     if (interrupted) 
     { 
      timeoutAction(); 
     } 
    } 
} 

對於咧嘴一笑,我把一個timeoutAction,這樣你可以在此模式下使用它:

AbortableProc.Execute(
    () => { Process(kStarting); Process(kWorking); Process(kCleaningUp); }, 
    () => { if (IsWorking()) CleanUp(); } 
}; 
2

這應該助陣。

Implement C# Generic Timeout

+0

除了它使用(背景)Thread和Thread.Abort()。 – 2011-02-07 21:57:46

+0

這是不可能的,如果沒有使用其他線程或主線程定期檢查自己。 – Telavian 2011-02-07 22:38:38

1

我與你,直到你說你需要它在主線程中運行。我認爲你描述的方式不可能。

問題是,你將需要至少兩個線程來執行計時和實際工作,並且這些都不是主線程,因爲計時器不會使用主線程,並且因爲你將要操作終止,如果它是主線程將關閉整個應用程序。你通常會這樣做的方式是設置一個從主線程運行的包裝類,併爲該操作以及定時器設置後臺線程。

爲什麼第三方庫必須從主線程調用?

相關問題