螺纹开口结束后有多接近?

时间:2013-08-03 12:51:43

标签: c# winforms

我想知道在我的功能结束后如何中止我的线程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
}

我想在完成后中止我的线程的原因是因为我认为这是我的内存缺乏理由,以防万一我打开很多并行线程并在ond上运行它(我的应用程序内存使用量读取超过1千兆)

2 个答案:

答案 0 :(得分: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;
      }
   }
}

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

答案 1 :(得分:-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();
}