0

我想遍历一个 URL 列表并检查每个 URL 是否该网站已关闭或未使用多个线程。

我的做法:

            while (_lURLs.Count > 0)
            {
                while (_iRunningThreads < _iNumThreads)
                {
                    Thread t = new Thread(new ParameterizedThreadStart(CheckWebsite));                        
                    string strUrl = GetNextURL();
                    if (!string.IsNullOrEmpty(strUrl))
                    {
                        t.Start(strUrl);
                        _iRunningThreads++;
                    }
                    else
                    {
                        break;
                    }
                }
            }

    private string GetNextURL()
    {
        lock (_lURLs)
        {
            if (_lURLs.Count > 0)
            {
                string strRetVal = _lURLs[0];
                _lURLs.RemoveAt(0);
                return strRetVal;
            }
            else
            {
                return string.Empty;
            }
        }
    }

当一个线程完成时,该_iRunningThreads属性会递减。

我的问题是:外部 while 循环阻止了所有“ while (_lURLs.Count > 0)”。在外部 while 循环中添加 aApplication.DoEvents()会有所帮助,但我想使用 ac# 库中Application.DoEvents()不可用的代码。

谢谢你的帮助。

4

2 回答 2

3

您可以使用TPL来代替自己管理线程。
此外,如果您使用的是 .Net Framework 4.5,您甚至可以添加 async/await 和WhenAll 方法来防止阻塞......

这是一个小例子:

private async Task CheckUrl()
    {
        List<Task> tasks = new List<Task>();

        string url = GetNextUrl();
        while (!String.IsNullOrEmpty(url))
        {
            tasks.Add(Task.Run(() => CheckWebSite(url)));
            url = GetNextUrl();
        }

        await Task.WhenAll(tasks);

        // All tasks have finished...

    }
于 2013-04-06T12:52:35.457 回答
1

如果任务需要很短的时间来完成,我认为在这种情况下使用 .NET ThreadPool 将是一个好主意。

查看:http: //msdn.microsoft.com/en-us/library/4yd16hza.aspx

这使您可以稍微简化代码,因为 ThreadPool 会自动管理工作线程的数量。您只需调用ThreadPool.QueueUserWorkItem您拥有的每个 URL 并增加一个正在运行的任务计数器。将项目排队到ThreadPool不会阻塞 UI 线程。

让 ThreadPool 任务减少计数器(就像现在一样),当计数器变为零(所有任务都已运行)时调用回调函数,以便您的主代码知道何时处理了所有 URL。您可以通过该回调更新 UI 或您想要执行的任何其他操作。

于 2013-04-06T12:37:55.393 回答