如何在c#中处理线程
本文关键字:处理 线程 | 更新日期: 2023-09-27 18:12:19
我在我的web应用程序中使用了线程,我在下面提到:
var t1 = new Thread(F1);
t1.IsBackground = true;
t1.Start();
var t2 = new Thread(F2);
t2.IsBackground = true;
t2.Start();
var t3 = new Thread(F3);
t3.IsBackground = true;
t3.Start();
var t4 = new Thread(F4);
t4.IsBackground = true;
t4.Start();
t1.Join();
t2.Join();
t3.Join();
t4.Join();
这工作得很好,给了我想要的输出。
我是否需要在此之后杀死/处置线程,如果是,然后如何?请指导。
我已经告诉过,如果我不处理它,它可能会引起性能问题。
对Join()
的调用将重新分配线程。你什么都不用做。只要确保线程在退出之前清理掉它们可能正在使用的所有资源就可以了。
也就是说,我建议您考虑使用线程池或任务并行库(TPL),而不是显式地管理线程。它们更容易使用,处理这类事情也更顺利。
如果我是你,我会使用ThreadPool而不是手动线程。它自己处理所有的东西,你没有创建和销毁线程的开销。代码可能会稍微复杂一点,因为你需要使用一个ManualResetEvent而不是一个简单的Thread.Join()(参见我如何完成ThreadPool.Join?),但是你不必担心创建太多的线程,而且它几乎快了40倍。
下面是我编写的比较两种方法的测试类:
class ThreadPoolVsThreads
{
private static readonly PerformanceMonitor threadPoolTest = new PerformanceMonitor("ThreadPoolTest");
private static readonly PerformanceMonitor threadTest = new PerformanceMonitor("ThreadTest");
private const int iterations = 100;
private const int threads = 10;
private static long somevalue;
public static void Test()
{
TestHelper.PerformTest(10, threadPoolTest, ThreadPoolTest);
TestHelper.PerformTest(10, threadTest, ThreadTest);
}
private static void ThreadPoolTest(int iteration)
{
for (int i = 0; i < iterations; i++)
{
var resetEvents = new ManualResetEvent[threads];
for (int j = 0; j < threads; j++)
{
var re = new ManualResetEvent(false);
resetEvents[j] = re;
ThreadPool.QueueUserWorkItem(o =>
{
somevalue++;
re.Set();
});
}
WaitHandle.WaitAll(resetEvents);
}
}
private static void ThreadTest(int iteration)
{
for (int i = 0; i < iterations; i++)
{
var threadArray = new Thread[threads];
for (int j = 0; j < threads; j++)
{
var thread = new Thread(o => somevalue++);
threadArray[j] = thread;
thread.Start();
}
for (int j = 0; j < threads; j++)
{
threadArray[j].Join();
}
}
}
}
下面是五次运行的输出:
ThreadPoolTest动作完成:iteration = 1, completionTime = 53, averageCompletionTime = 53.000
ThreadTest动作完成:iteration = 1, completionTime = 2128, averageCompletionTime = 2128.000
ThreadPoolTest动作完成:iteration = 2, completionTime = 42, averageCompletionTime = 47.500
ThreadTest动作完成:iteration = 2, completionTime = 2149, averageCompletionTime = 2138.500
ThreadPoolTest动作完成:iteration = 3, completionTime = 65, averageCompletionTime = 53.333
ThreadTest动作完成:iteration = 3, completionTime = 2078, averageCompletionTime = 2118.333
ThreadPoolTest动作完成:迭代= 4,completionTime = 72, averageCompletionTime = 58.000
ThreadTest动作完成:iteration = 4, completionTime = 2137, averageCompletionTime = 2123.000
ThreadPoolTest动作完成:iteration = 5, completionTime = 43, averageCompletionTime = 55.000
ThreadTest动作完成:iteration = 5, completionTime = 2085, averageCompletionTime = 2115.400