启动多个线程并从我的.NET应用程序中跟踪它们其中的一部分,因为我需要手动杀死它们,或者我的应用程序稍后会关闭我的应用程序。示例==>启动线程Alpha,启动线程测试..然后在我的应用程序中的任何时候我应该能够说终止线程测试..在.NET中跟踪打开线程的最佳方法是什么?我需要知道什么(一个id?)关于一个线程来终止它?示例代码,教程会有所帮助。您可以省去繁重的工作并使用这个智能线程池。它提供了一个工作单元系统,允许您随时查询每个线程的状态,并终止它们。如果这太麻烦,那么如上所述IDictionary可能是最简单的解决方案。或者更简单的方法是为每个线程命名并使用IList:publicclassMyThreadPool{privateIList_threads;私有只读intMAX_THREADS=25;publicMyThreadPool(){_threads=newList();}publicvoidLaunchThreads(){for(inti=0;i当然你可以更多地参与并使它复杂化。如果杀死你的线程对时间不敏感(例如,如果你不需要在3秒内杀死一个线程UI),那么Thread.Join()是更好的做法。如果你还没有读过它,JonSkeet对SO上常见的“不要使用中止”建议有很好的讨论和解决方案。你可以创建一个字典线程并为它们分配ID,例如:Dictionarythreads=newDictionary();for(inti=0;i如果您不想根据ID保存线程,您可以使用列表并稍后枚举它以终止线程。..您可以在希望终止它们时中止它们。在MethodToExe中有一些条件允许该方法允许线程正常终止会很好。类似于:voidMethodToExe(){while(_isRunning){//你在这里编码//if(!_isRunning){break;}//你在这里编码//}}要中止你可以枚举字典并调用Thread.Abort()。准备好捕获ThreadAbortException我问过类似的问题并得到了一些很好的答案:关闭多线程应用程序注意:我的问题不需要正常退出,但人们仍然建议我正常退出每个线程的循环。要记住的主要事情是,如果你想避免让线程阻止你的进程终止,你应该将所有线程设置为后台:Threadthread=newThread(newThreadStart(testObject.RunLoop));thread.IsBackground=true;thread.start();启动和管理线程的首选方式是在ThreadPool中,但几乎任何容器都可用于保存对线程的引用。你的线程应该总是有一个标志告诉它们终止,并且它们应该不断地检查它。此外,为了更好地控制,您可以为您的线程提供一个CountdownLatch:只要线程退出其循环,它就会在CountdownLatch上发出信号。您的主线程将调用CountdownLatch.Wait()方法,该方法将阻塞,直到所有线程都收到信号……这使您可以正确清理并确保在开始清理之前关闭所有线程。公共类CountdownLatch{privateintm_remain;私有EventWaitHandlem_event;公共CountdownLatch(int计数){重置(计数);}publicvoidReset(intcount){if(count值得一提的是,Thread.Abort()方法做了一些奇怪的事情:当一个线程自己调用Abort时,其效果类似于抛出异常;ThreadAbortException立即发生,并且结果是可以预见的。但是,如果一个线程在另一个线程上调用Abort,则中止将中断任何正在运行的代码。也有可能中止静态构造函数。在极少数情况下,这可能会阻止在该应用程序域中创建类的实例。在.NETFramework1.0和1.1版中,线程可以在finally块运行时中止,在这种情况下,finally块将被中止。如果被中止的线程位于受保护的代码区域(例如catch块、finally块或受约束的执行区域)中,则调用Abort的线程可能会阻塞。如果调用Abort的线程持有中止线程所需的锁,则会发生死锁。创建线程后,您可以设置其Name属性。假设您将它存储在某个集合中,您可以通过LINQ轻松访问它以检索(并中止)它:varmyThread=(selectthreadfromthreadswherethread.Nameequals"myThread").FirstOrDefault();如果(myThread!=null)myThread.Abort();哇,这么多答案..你可以简单地使用一个数组来保存线程,这只有在对数组的访问是顺序的时才有效,但如果你有另一个线程来访问这个数组,你将需要同步访问。可以使用线程池,但是线程池非常有限,只能容纳固定数量的线程。如上所述,您可以创建自己的线程池,.NETv4中的线程池随着安全集合的引入变得更加容易。您可以通过保留一个互斥对象列表来管理它们,该列表将确定这些线程何时完成,线程将在每次运行之前查询互斥对象,然后执行其他操作,如果已设置,则终止,您可以从任何地方管理静音,并且由于互斥体通过防御是线程安全的,这很容易。我可以想到其他10种方法,但这些方法似乎都有效。如果它们不符合您的需求,请告诉我。取决于您的需求有多复杂。您可以使用辅助方法等实现您自己的ThreadPool类型。但是,我认为这就像维护列表/数组并相应地向集合中添加/删除线程一样简单。您还可以使用字典集合并使用您自己的特定键类型(即Guids/字符串)检索它们。当您启动每个线程时,将其ManagedThreadId作为键放入Dictionary,将线程实例作为值。使用每个线程的回调返回其ManagedThreadId,您可以使用它在终止时从Dictionary中删除线程。如果需要,您还可以使用Dictionary中止线程。使线程成为后台线程,以便在应用程序意外终止时终止它们。您可以使用单独的回调来指示线程继续或暂停,这反映了UI设置的标志以正常退出。您还应该在线程中捕获ThreadAbortException,以便在必须中止线程时可以进行任何清理。以上是C#学习教程:启动多个线程并跟踪它们从我的.NET应用程序共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多加关注---本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
