线程仍然在C#中运行或终止异常

时间:2011-02-21 06:30:34

标签: c# multithreading

这是我的代码。我有一个获取图像的队列。在循环中检索图像,这意味着queueForImages.count总是增加。因此,当我尝试运行此程序时,有时会抛出此异常,有时则不会。我的意思是我退出了应用程序,现在我再次运行它。它有时会显示此异常,有时则不会。 我是新手。你可以说我是一个知道线程的门外汉。那我错过了什么?在退出申请之前,我是否必须处理该线程?

static void Main(string[] args)

        {

            Program obj = new Program();

            obj.handlerForImageBuffer();

        }

        void handlerForImageBuffer()

        {

            Bitmap mp = (Bitmap)Bitmap.FromFile(@"path.bmp");

            Thread imageThread = new Thread(new ThreadStart(processImages));

            for ( ; ; )

            {

                Console.WriteLine("Count: " + queueForImages.Count);

                if (queueForImages.Count == 10)

                {

                    queueFlag = true;                  

                    imageThread.Start();//Here comes the exception

                    Console.WriteLine("Q HAS 10 Elements");

                }
                queueForImages.Enqueue(Process(mp));//Same image is added for infinite times, just for the sake of testing.


            }

        }

3 个答案:

答案 0 :(得分:2)

您应该提供 imageThread 的代码。目前我猜您正在使用Queue<T>的实例来存储图像,这不是线程安全的。如果您使用的是C#4.0,可以尝试ConcurrentQueue<T>以确保踏板安全。如果您使用的是旧版本,则可以实现从内置版本派生的Queue<T>,并覆盖Enqueue / Dequeue方法以使其成为线程安全的。

答案 1 :(得分:2)

您不能重复使用相同的线程对象。它只能运行一次Start方法。因此,如果您想再次运行runa方法,则必须创建一个新的Thread对象。

    void handlerForImageBuffer()

    {

        Bitmap mp = (Bitmap)Bitmap.FromFile(@"path.bmp");

        for ( ; ; )

        {

            Console.WriteLine("Count: " + queueForImages.Count);

            if (queueForImages.Count == 10)

            {

                queueFlag = true;                  

                Thread imageThread = new Thread(new ThreadStart(processImages));

                imageThread.Start();//Here comes the exception

                Console.WriteLine("Q HAS 10 Elements");

            }
            queueForImages.Enqueue(Process(mp));//Same image is added for infinite times, just for the sake of testing.


        }

    }

答案 2 :(得分:1)

  

BrokenGlass编辑了我的帖子。我有   只用了一个线程。这需要   在图像计数时调用   达到10.然后将这些出列   图片。 -

而且存在问题 - 当您从队列中取消图像时,它的项目数减少一个 - 所以如果之前有11个图像,那么现在有10个然后是

  if (queueForImages.Count == 10)

会导致您看到的异常。要解决这个问题,请结合@Danny Chen和@dzendras提供的其他答案:

  1. 使用ConcurrentQueue代替 无论你现在使用什么 - 经常 队列不是线程安全的。

  2. 每次创建新的Thread实例 Count == 10因为是的,这个 可以多次出现,因为您在主线程上添加新图像,并在单独的线程上同时删除它们。