中止.NET線程
回答
線程應該非常永遠被中止。它根本不安全。把這看作是放下已經生病的過程的一種方式。否則,避免像瘟疫一樣。
這樣做的更正確的方法是讓代碼可以定期檢查,並且本身決定退出。
f.e.只是空回報聲明? – Xorty 2010-06-24 07:10:18
@Xorty - 這取決於場景,它在做什麼,但也許。也許是一個例外。也許'打破;' – 2010-06-24 07:26:29
Thread.Abort會做你想做的,但不建議中止線程,更好的選擇是想辦法通過Thread synchronization機制
線程是同齡人的正確創建完成的線程,獲取句柄到線程A然後調用ThreadA.Abort()
強行結束它。最好在線程中檢查一個布爾值,並且如果它的計算結果爲false,則退出該線程。
public class MyClass
{
public static Thread ThreadA;
public static Thread ThreadB;
private void RunThings()
{
ThreadA = new Thread(new ThreadStart(ThreadAWork));
ThreadB = new Thread(new ThreadStart(ThreadBWork));
ThreadA.Start();
ThreadB.Start();
}
static void ThreadAWork()
{
// do some stuff
// thread A will close now, all work is done.
}
static void ThreadBWork()
{
// do some stuff
ThreadA.Abort(); // close thread A
// thread B will close now, all work is done.
}
}
停止線程的禮貌的方式的一個例子:
using System;
using System.Threading;
namespace Treading
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main program starts");
Thread firstThread = new Thread(A);
ThreadStateMessage messageToA = new ThreadStateMessage(){YouShouldStopNow = false};
firstThread.Start(messageToA);
Thread.Sleep(50); //Let other threads do their thing for 0.05 seconds
Console.WriteLine("Sending stop signal from main program!");
messageToA.YouShouldStopNow = true;
firstThread.Join();
Console.WriteLine("Main program ends - press any key to exit");
Console.Read();//
}
private class ThreadStateMessage
{
public bool YouShouldStopNow = false; //this assignment is not really needed, since default value is false
}
public static void A(object param)
{
ThreadStateMessage myMessage = (ThreadStateMessage)param;
Console.WriteLine("Hello from A");
ThreadStateMessage messageToB = new ThreadStateMessage();
Thread secondThread = new Thread(B);
secondThread.Start(messageToB);
while (!myMessage.YouShouldStopNow)
{
Thread.Sleep(10);
Console.WriteLine("A is still running");
}
Console.WriteLine("Sending stop signal from A!");
messageToB.YouShouldStopNow = true;
secondThread.Join();
Console.WriteLine("Goodbye from A");
}
public static void B(object param)
{
ThreadStateMessage myMessage = (ThreadStateMessage)param;
Console.WriteLine("Hello from B");
while(!myMessage.YouShouldStopNow)
{
Thread.Sleep(10);
Console.WriteLine("B is still running");
}
Console.WriteLine("Goodbye from B");
}
}
}
使用Thread.Abort的();如果您的線程處於任何類型的等待狀態,則會導致拋出異常。由於線程可以等待的方式有很多種,所以處理起來很麻煩。正如其他人所說,你通常應該避免這樣做。
這裏是另一種方式來禮貌地信號線程死:
注意,這有利於時裝有限狀態自動機,其中從定期檢查住權限,那麼如果允許執行任務。任務不會中斷,並且是「原子」的。這對於簡單的循環或命令隊列很有效。另外這可以確保線程不被給予從線程休息一段時間,這一個設置爲0,如果你不從你想要的任何其他旋轉100%的CPU。
- 1. 線程在.net中
- 2. GC是否停止.NET中的所有應用程序線程?
- 3. .net多線程
- 4. .net多線程?
- 5. .NET中的後臺線程
- 6. 在.Net中阻塞線程
- 7. 使用scintilla NET停止在backgroundworker線程中不凍結GUI
- 8. .NET Webservice處理大文件正在使其線程中止
- 9. 什麼會導致.NET進程/線程意外終止?
- 10. 停止線程
- 11. 停止線程
- 12. 終止線程
- 13. 停止線程
- 14. C#.Net中的應用程序關閉時可以中止前臺線程嗎?
- 15. 停止python中的線程
- 16. reactjs.net線程已被中止
- 17. 中止非工作線程
- 18. 中止阻塞線程
- 19. 中止一個線程?
- 20. STA線程中止異常
- 21. Java,停止(中斷)線程
- 22. 線程正在中止
- 23. 如何中止線程
- 24. AdjustThreadsInPool,線程中止異常
- 25. 在Java中停止線程?
- 26. .net線程監視
- 27. .net線程執行
- 28. .net:線程調試
- 29. 監視.NET線程
- 30. .NET線程同步
你應該解釋爲什麼你想中止這些線程。 – apoorv020 2010-06-24 08:31:29
C#沒有線程。你的意思是「.NET線程」。 – 2010-07-15 16:36:31