Zer*_*ity 6 c# asp.net multithreading asp.net-4.0
我在我的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();
Run Code Online (Sandbox Code Playgroud)
这工作正常,给我所需的输出.
我是否需要在此之后杀死/处置线程,如果是,那么如何?请指导.
我告诉过,如果我不处理它,可能会引发性能问题.
Jim*_*hel 12
调用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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是五次运行的输出:
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操作已完成:iteration = 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
| 归档时间: |
|
| 查看次数: |
10021 次 |
| 最近记录: |