【发布时间】:2014-12-12 14:06:25
【问题描述】:
我这里有问题。有没有办法以编程方式找出某个线程退出的时刻?我的意思是,即使是 VS 调试器也会在其输出窗口中为您提供该信息。我知道我可以简单地让我的线程引发一个事件,但是当你产生多个线程时这当然会导致问题,所以它们每个都会引发那个事件,除非你使用一些切换变量来确保只有代码中到达该点的第一个线程将引发事件。
这里是在多个线程中执行的方法的开始,这里显示了取消、暂停和退出逻辑。代码的问题点是对事件处理程序(DownloadComplete、DownloadPaused 和 DownloadCanceled)的调用。如您所见,其中一些将仅由到达该点的第一个线程执行一次,然后切换相关的布尔变量,因此其他线程不会再次引发此事件。这里的另一个大问题是线程退出逻辑,当线程找不到要下载的项目并返回并引发下载完成事件时,当然每个线程都会触发该事件。这两种方法都不正确,我目前不知道如何实现我的预期行为。我所需要的只是知道如何找到一种方法来捕捉所有衍生线程中的最后一个结束时的时刻,这样我就可以只引发一次上述所有事件。
请注意,我无法访问 System.Threading.Tasks 命名空间中的类型,因为我的项目针对 .net 2.0。这是我第一次编程比一些类分配更复杂的东西,所以我意识到这段代码很可能很糟糕。
对不起我的英语。
private void PerformDownload()
{
while (true)
{
if (askedToCancel)
{
lock (lockObj)
{
if (!cancellationPerformed)
{
cancellationPerformed = true;
foreach (DownloadItem di in itemsToProcess)
if (di.Status == DownloadItemStatus.Prepared)
itemsToProcess.UpdateItemStatus(di.URL, DownloadItemStatus.Canceled);
DownloadCanceled();
}
}
return;
}
if (askedToPause)
{
lock (lockObj)
{
if (!pausingPerformed)
{
foreach (DownloadItem di in itemsToProcess)
if (di.Status == DownloadItemStatus.Prepared)
itemsToProcess.UpdateItemStatus(di.URL, DownloadItemStatus.Paused);
DownloadPaused();
}
}
waitHandle.WaitOne();
}
DownloadItem currentItem = null;
lock (lockObj)
{
foreach (DownloadItem di in itemsToProcess)
if (di.Status == DownloadItemStatus.Prepared)
{
currentItem = di;
itemsToProcess.UpdateItemStatus(currentItem.URL, DownloadItemStatus.Downloading);
break;
}
}
if (currentItem == null)
{
DownloadComplete();
return;
}
【问题讨论】:
标签: c# multithreading