C# 如何加入/中止一组动态创建的线程?
我在结束一组动态创建的线程时遇到了一些问题。我需要在任何给定点结束所有这些操作的原因是为了刷新表单的某些部分并创建新的部分。这里有一个简单的场景来展示我的线程中发生了什么 许多线程是根据某些变量动态创建的:C# 如何加入/中止一组动态创建的线程?,c#,multithreading,dynamic,threadabortexception,C#,Multithreading,Dynamic,Threadabortexception,我在结束一组动态创建的线程时遇到了一些问题。我需要在任何给定点结束所有这些操作的原因是为了刷新表单的某些部分并创建新的部分。这里有一个简单的场景来展示我的线程中发生了什么 许多线程是根据某些变量动态创建的: for (int i = 0; i <= mDevices.Count; i++) { ThreadStart workerThread = delegate { pollDevices(mDevices[i - 2], this); };
for (int i = 0; i <= mDevices.Count; i++)
{
ThreadStart workerThread = delegate { pollDevices(mDevices[i - 2], this); };
new Thread(workerThread).Start();
}
public void pollDevices(IDeviceInterface device, DeviceManager mainUI)
{
System.Timers.Timer timer = null;
if (timer == null)
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { timerElapsed(sender, e, device, mainUI); };
}
timer.Enabled = true;
public void timerElapsed(object sender, ElapsedEventArgs e, IDeviceInterface device, DeviceManager mainUI)
{
device.connect(device, this);
//wait till thread finishes and destroy
Thread.CurrentThread.Abort();
}
for(inti=0;i为什么在线程进程中使用计时器
ManualResetEvent exit = new ManualResetEvent(false);
for (int i = 0; i <= mDevices.Count; i++)
{
ThreadStart workerThread = delegate { pollDevices(mDevices[i - 2], this, exit); };
new Thread(workerThread).Start();
}
public void pollDevices(IDeviceInterface device, DeviceManager mainUI, ManualResetEvent exit)
{
while(!exit.WaitOne(1000))
{
// do work
device.connect(device, this);
}
}
ManualResetEvent退出=新的ManualResetEvent(假);
对于(int i=0;i我在我的一个解决方案中使用了这个
这是AbortableThreadPool。可能对你有用
还有一点让人困惑的是,为什么要调用Thread.Abort in time在一个无论如何都要结束的线程上重新出现问题您有几个问题
- 你是
- 创建线程的唯一目的是启动计时器…为什么不在主线程中启动计时器呢
- 您的计时器实例不是根实例,因此在您使用它之前,它可能有资格进行垃圾收集
System.Timers.Timer
事件处理程序将在ThreadPool
线程上执行(至少在本例中是这样),因此尝试中止其中一个线程不会有好的结果
这里有足够多的问题,在我们回答您的主要问题之前,您需要进行一些重大的重组。不过还有一个提示…不要尝试从主UI线程以外的线程访问或操作任何UI元素。我在线程进程中使用计时器,因为我需要根据计时器轮询设备。这样我就可以如果将device.connect()调用为device.poll(),则可能会对您的观点更有意义嗯,使用这种方法,它似乎永远不会进入循环来执行代码..在我发布并取出它之后意识到了这一点,哎呀!我想我需要重新思考某些事情,然后再继续…有什么指针/事情我应该先找吗?