我有一些方法需要較長的時間來執行並涉及大量的數據庫操作。我想在可超時的方法中包裝這些方法,以便如果它在不變的時間內沒有回調,我會回滾。如何在C#中編寫超時方法
有沒有辦法做到這一點,我也必須在主線程中運行方法只是因爲我使用的第三方COM對象無法在後臺線程中執行。
任何類型的建議將不勝感激。
問候,
Bibek Dawadi
我有一些方法需要較長的時間來執行並涉及大量的數據庫操作。我想在可超時的方法中包裝這些方法,以便如果它在不變的時間內沒有回調,我會回滾。如何在C#中編寫超時方法
有沒有辦法做到這一點,我也必須在主線程中運行方法只是因爲我使用的第三方COM對象無法在後臺線程中執行。
任何類型的建議將不勝感激。
問候,
Bibek Dawadi
我敲了一個類似於鏈接到的解決方案,除了我使用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(); }
};
這應該助陣。
除了它使用(背景)Thread和Thread.Abort()。 – 2011-02-07 21:57:46
這是不可能的,如果沒有使用其他線程或主線程定期檢查自己。 – Telavian 2011-02-07 22:38:38
我與你,直到你說你需要它在主線程中運行。我認爲你描述的方式不可能。
問題是,你將需要至少兩個線程來執行計時和實際工作,並且這些都不是主線程,因爲計時器不會使用主線程,並且因爲你將要操作終止,如果它是主線程將關閉整個應用程序。你通常會這樣做的方式是設置一個從主線程運行的包裝類,併爲該操作以及定時器設置後臺線程。
爲什麼第三方庫必須從主線程調用?
除非有人有更好的想法,我會認爲一個方法屬性可能是有序的。否則,定時器或其他設計建議的任務。 – IAbstract 2011-02-07 21:29:34