C#多线程问题求解答
在一个类里开几个工作线程,并且在类被释放之前(调用Dispose方法)都保持运行。线程方法里面使用while(true)来保持运行,为了节省开销用AutoResetEvent控制。
整个流程是在一个项目里看到的,我把关键部分的代码提出来:
本来原来是没有手动释放功能的,我自己加上后,在执行Dispose方法之后,我看了下Thread List里面的线程,只有一个被释放了(Alive为false),其它的还在继续运行。
所以想知道AutoResetEvent 是不是只对一个线程起作用,还有这种情况下如何设计才能“准确”释放掉所有相关的后台工作线程。
整个流程是在一个项目里看到的,我把关键部分的代码提出来:
public class ThreadsTest : IDisposable
{
public ThreadsTest()
{
this.threads = new List<Thread>();
this.Initialized = false;
this.Disposing = false;
this.blocker = new AutoResetEvent(false);
int processerCount = Environment.ProcessorCount > 0 ?
Environment.ProcessorCount : 1;
for (int i = 0; i < processerCount; i++)
{
Thread thread = new Thread(this.ThreadFunc);
thread.Name = string.Format("Threads test worker thread {0}", i);
thread.IsBackground = true;
thread.Priority = ThreadPriority.Lowest;
thread.Start();
this.threads.Add(thread);
}
this.Initialized = true;
this.blocker.Set();
}
public bool Initialized { get; private set; }
public bool Disposing { get; private set; }
private List<Thread> threads;
private AutoResetEvent blocker;
public event Action Disposed;
private void ThreadFunc()
{
if (!this.Initialized)
{
this.blocker.WaitOne();
}
while (true)
{
if (this.Disposing)
{
break;
}
Console.WriteLine("{0} running.", Thread.CurrentThread.Name);
this.blocker.WaitOne();
}
if (this.Disposed != null)
{
this.Disposed();
}
}
public void Dispose()
{
this.Disposing = true;
this.blocker.Set();
}
}
本来原来是没有手动释放功能的,我自己加上后,在执行Dispose方法之后,我看了下Thread List里面的线程,只有一个被释放了(Alive为false),其它的还在继续运行。
所以想知道AutoResetEvent 是不是只对一个线程起作用,还有这种情况下如何设计才能“准确”释放掉所有相关的后台工作线程。
...全文
相关推荐
C# 礼物
**求帮助的方式**:作者通过公开邮箱寻求帮助,这是程序员们常见的寻求解答问题的方式之一,也表明了开源社区和互助精神在编程世界的重要性。8.
《Visual C# 2008 How to Program Solution Manual》习题解答合集
本文还有配套的精品资源,点击获取 简介:这本《Visual C# 2008 How to Program》的Solution Manual,为读者提供了一条深入理解C#编程核心概念和技术的途径。作者Deitel兄弟以丰富的教学经验和详实的实例,带领读者掌握.NET Framework 3.5环境下C#的高级特性及应用。本书涵盖了从基础语法到复杂特性的广泛话题,包括委托、事件...
C#经典的面试题
**更多关于new的用法** - 还可以用于初始化字段,如`int[] arr = new int[5];`以上就是C#面试中常见的问题及其解答,涵盖了语言基础、多线程、异常处理、集合与泛型等多个方面,
C# 实现数独解答C# 实现数独解答C# 实现数独解答
在C#编程语言中实现数独解答通常涉及到算法设计、递归和回溯等概念。下面我们将深入探讨这些知识点。1.
c#常见问题与解答
**C#常见问题与解答** - **命名规则**:C#有严格的命名规则,变量名、类名等应遵循驼峰命名或Pascal命名法。


