我刚刚开始学习 C# 线程和并发集合,并且不确定提出问题的正确术语,所以我将简要描述我正在尝试做的事情。在这一点上,我对这个主题的理解充其量只是初步的。我的方法是否像我想象的那样可行?
我在 Concurrent 集合中有 100,000 个 url 必须进行测试——链接仍然有效吗?我有另一个并发集合,最初是空的,它将包含异步请求确定已移动的 url 子集(400、404 等错误)。
我想在我的电脑和我们的带宽允许的情况下同时产生尽可能多的这些异步请求,并且将从每秒 20 个异步网络请求任务开始,然后从那里开始。
如果单个异步任务同时处理这两件事,它会起作用吗:它会发出异步请求,然后如果遇到 4xx 错误,则将 url 添加到 BadUrls 集合中?该任务的一个新实例将每 50 毫秒产生一次:
class TestArgs args {
ConcurrentBag<UrlInfo> myCollection { get; set; }
System.Uri currentUrl { get; set; }
}
ConcurrentQueue<UrlInfo> Urls = new ConncurrentQueue<UrlInfo>();
// populate the Urls queue
<snip>
// initialize the bad urls collection
ConcurrentBag<UrlInfo> BadUrls = new ConcurrentBag<UrlInfo>();
// timer fires every 50ms, whereupon a new args object is created
// and the timer callback spawns a new task; an autoEvent would
// reset the timer and dispose of it when the queue was empty
void SpawnNewUrlTask(){
// if queue is empty then reset the timer
// otherwise:
TestArgs args = {
myCollection = BadUrls,
currentUrl = getNextUrl() // take an item from the queue
};
Task.Factory.StartNew( asyncWebRequestAndConcurrentCollectionUpdater, args);
}
public async Task asyncWebRequestAndConcurrentCollectionUpdater(TestArgs args)
{
//make the async web request
// add the url to the bad collection if appropriate.
}
可行的?走开?