您好我正在构建一个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();
有任何改进吗?
答案 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 ...
}
我认为这就是我的全部。