1

我想知道我的函数结束后如何中止我的线程Thread.Abort();
我的应用程序正在运行文件并且打开​​的每个文件都是不同的线程

int _counter;
int _parallelThreads
_queue = new Queue();

public void transmit()
{
    while (_counter < _parallelThreads)
    {
        lock (_queue)
        {
            string file = (string)_queue.Dequeue();
            ThreadStart ts = delegate { processFile(file); };
            Thread thread = new Thread(ts);
            thread.IsBackground = true;
            thread.Start();
            _counter++;
        }
    }
}

private void processFile(string file)
{
    WiresharkFile wf = new WiresharkFile(file, _selectedOutputDevice, 1);
    wf.OnFinishPlayEvent += wf_OnFinishPlayEvent;
    wf.sendBuffer();
}

这是我的文件完成的事件

private void wf_OnFinishPlayEvent(MyClass class)
{
   // here i want to abort my thread
}

我想在线程完成后中止线程的原因是因为我认为这是我的内存不足的原因,以防我打开很多并行线程并反复运行它(我的应用程序内存使用量读取超过 1 giga)

4

2 回答 2

1

当你中止一个线程时,很多意想不到的事情可能会出错。特别是当您处理文件时。当我不得不这样做(例如,“取消”按钮)时,我使用了一个小技巧。

我在IsCanceled两个线程都可以看到的范围内设置了一个标志true,并且在工作线程上,每隔几条语句将检查该标志并关闭所有打开的文件并自行结束。

wf.sendBuffer();根据逻辑,这可能不适用于您的情况。让我知道

例子:

private void processFile(string file)
{
    WiresharkFile wf = new WiresharkFile(file, _selectedOutputDevice, 1);
    wf.OnFinishPlayEvent += wf_OnFinishPlayEvent;

    if(IsCanceled == false)
    {
       wf.sendBuffer();
    }
}

如果sendBuffer()方法逻辑太长,那么

public void sendBuffer()
{
    // some logic

    if(IsCanceled)
    {
       // close open streams
       return;
    }

    // some logic
}

至于标志本身,单例类可以做到这一点,或者所有其他类都知道的类

public class Singleton
{
   private static Singleton instance;
   private bool isCanceled;
   private Singleton() 
   {
       isCanceled = false;
   }

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }

   public bool IsCanceled
   {
      get 
      {
         return isCanceled;
      }
      set
      {
         isCanceled = value;
      }
   }
}

请注意,单例类对所有人开放,您可能希望使用只有需要检查它的线程知道的类。这取决于您的安全需求。

于 2013-08-03T13:31:12.657 回答
-1

您不应该中止线程,当其中的代码完成时,线程将自动退出。也许您只想等待线程完成,然后再做其他事情。
您可以使用数组来存储线程,并使用 Thread.Join() 等待所有线程结束。

List<Thread> threadList = new List<Thread>();

public void transmit()
{
    while (_counter < _parallelThreads)
    {
        lock (_queue)
        {
            string file = (string)_queue.Dequeue();
            ThreadStart ts = delegate { processFile(file); };
            Thread thread = new Thread(ts);
            thread.IsBackground = true;        
            threadList.Add(thread);       //add thread to list
            thread.Start();
            _counter++;
        }
    }
    //wait threads to end
    foreach(Thread t in threadList)
          t.Join();
}

private void processFile(string file)
{
    WiresharkFile wf = new WiresharkFile(file, _selectedOutputDevice, 1);
    wf.OnFinishPlayEvent += wf_OnFinishPlayEvent;
    wf.sendBuffer();
}
于 2013-08-03T13:17:33.870 回答