打开线程/关闭线程/列表线程

问题描述 投票:0回答:1

您好我正在构建一个C#应用程序,我对线程的问题很少。

首先,我想在具有一些参数的函数中打开线程。我有以下代码例如:

Thread GetStaff= new Thread(() => GetStaff(arg1));
GetStaff.Name = "Get Staff";
GetStaff.Start();
main_threads.Add(GetStaff);

上面的代码是我用来打开线程的最佳代码吗? GetStaff.Name总是正确使用它为我的线程指定一个名称?

上面代码中的main_threads只是一个简单的列表。可以将所有线程保存在列表中并使用它列出它们吗?或者更好的动态代码列出线程?

我使用以下代码来关闭线程:

foreach (Thread thread_work in main_threads)
{
     if (thread_work.IsAlive)
     {
          thread_work.Abort();
          thread_work.Join();    
     }
}
main_threads.Clear();

有什么改进?

c# multithreading
1个回答
1
投票

当您使用多个线程时,不要使用列表,使用并发集合,因为它们是为线程安全而设计的,而普通通用列表则不是。

http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

GetStaff也不方便作为线程的名称。你可以把它称为getStaffThread或StaffThread,但它不是获得“staff”的线程,它是在线程中执行的函数。

也:

Thread GetStaff= new Thread(() => GetStaff(arg1));

你基本上是创建一个带有delegate参数的线程,该参数使用一个名为arg1的参数调用同一线程的构造函数,但是这甚至不会编译。

我认为你将线程和函数命名为GetStaff只是一个错误?或者你真的想要做我上面描述的事情吗?

无论如何,在任何一种情况下,Thread()的重载都带有一个带有参数的委托。

http://msdn.microsoft.com/en-us/library/1h2f2459.aspx

然后你可以做类似的事情。

// GetStaff thread ...
Thread getStaffThread = new Thread(GetStaff);
// ...

// GetStaff function ...
static void GetStaff(object o)
{
    // Do stuff ...
}

我认为这就是我的全部。

© www.soinside.com 2019 - 2024. All rights reserved.