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

时间:2013-11-24 13:39:47

标签: c# multithreading

您好我正在构建一个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();

有任何改进吗?

1 个答案:

答案 0 :(得分: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 ...
}

我认为这就是我的全部。