这是我的代码。我有一个获取图像的队列。在循环中检索图像,这意味着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.
}
}
答案 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提供的其他答案:
使用ConcurrentQueue
代替
无论你现在使用什么 - 经常
队列不是线程安全的。
每次创建新的Thread实例
Count == 10
因为是的,这个
可以多次出现,因为您在主线程上添加新图像,并在单独的线程上同时删除它们。