我有一個服務在循環中運行一些不同的任務,直到服務停止。 然而,我打電話給網絡服務和這個電話的任務之一可能需要幾分鐘才能完成。我希望能夠立即停止服務,'取消'Web服務調用,而不會調用Thread.Abort
,因爲這會導致一些奇怪的行爲,即使線程唯一正在調用此Web服務方法。如何在線程正在工作時停止服務(不使用Thread.Abort)
如何取消或從同步方法調用中斷(如果它甚至可能)? 或者我應該嘗試一種不同的方法?
我曾嘗試使用AutoResetEvent
,然後調用Thread.Abort
這是工作的罰款下面的代碼示例中,但落實在實際的服務這一解決方案時,我得到一些意外的行爲可能是因爲在外部庫發生了什麼事情的我正在使用。
AutoResetEvent
和Thread.Abort
:
class Program
{
static void Main(string[] args)
{
MainProgram p = new MainProgram();
p.Start();
var key = Console.ReadKey();
if (key.Key == ConsoleKey.Q)
p.Stop();
}
}
class MainProgram
{
private Thread workerThread;
private Thread webServiceCallerThread;
private volatile bool doWork;
public void Start()
{
workerThread = new Thread(() => DoWork());
doWork = true;
workerThread.Start();
}
public void Stop()
{
doWork = false;
webServiceCallerThread.Abort();
}
private void DoWork()
{
try
{
while (doWork)
{
AutoResetEvent are = new AutoResetEvent(false);
WebServiceCaller caller = new WebServiceCaller(are);
webServiceCallerThread = new Thread(() => caller.TimeConsumingMethod());
webServiceCallerThread.Start();
// Wait for the WebServiceCaller.TimeConsumingMethod to finish
WaitHandle.WaitAll(new[] { are });
// If doWork has been signalled to stop
if (!doWork)
break;
// All good - continue
Console.WriteLine(caller.Result);
}
}
catch (Exception e)
{
Console.Write(e);
}
}
}
class WebServiceCaller
{
private AutoResetEvent ev;
private int result;
public int Result
{
get { return result; }
}
public WebServiceCaller(AutoResetEvent ev)
{
this.ev = ev;
}
public void TimeConsumingMethod()
{
try
{
// Simulates a method running for 1 minute
Thread.Sleep(60000);
result = 1;
ev.Set();
}
catch (ThreadAbortException e)
{
ev.Set();
result = -1;
Console.WriteLine(e);
}
}
}
有人能提出一個解決這個問題?
不知道你的外部庫在做什麼答案都是純粹的猜測......你理論上可以用一些「標誌」來工作,你可以在這個線程中檢查這個線程是否可以安全地「中止」。 – Yahia 2012-02-14 08:04:21
你可以編寫你的WebServiceCaller和線程機制,以便它可以孤立並在它返回時自己死掉?清除doWork標誌,停止等待線程/事件,將任何回調設置爲null,忘記它,繼續。當長Web服務調用最終返回並且線程將其ref設置爲null並終止它自己時,沒有人注意或關心,(sob ..)。 – 2012-02-14 08:18:14
我可以,但是直到WS調用返回時,我的服務(以及它的進程)纔會完全停止。 – 2012-02-14 08:20:01