您好我正在构建一个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();
有什么改进?
当您使用多个线程时,不要使用列表,使用并发集合,因为它们是为线程安全而设计的,而普通通用列表则不是。
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 ...
}
我认为这就是我的全部。