まず最初に、私は同様の質問を読んでおり、一貫した説明をしません。私はBlockingCollection<WebClient> ClientQueue
を使ってWebクライアントを提供しています。私は彼らに処理関数を与え、非同期スクレイピングを開始します。WebClientは同時I/O操作をサポートしていません - DownloadStringAsync - スクレイピング
// Create queue of WebClient instances
BlockingCollection<WebClient> ClientQueue = new BlockingCollection<WebClient>();
for (int i = 0; i < 10; i++)
{
ClientQueue.Add(new WebClient());
}
//Triggering Async Calls
foreach (var item in source)
{
var worker = ClientQueue.Take();
worker.DownloadStringCompleted += (sender, e) => HandleJson(sender, e, ClientQueue, item);
worker.DownloadStringAsync(uri);
}
public static void HandleJson(object sender, EventArgs e, BlockingCollection<WebClient> ClientQueue, string item)
{
var res = (DownloadStringCompletedEventArgs) e;
var jsonData = res.Result;
var worker = (WebClient) sender;
var root = JsonConvert.DeserializeObject<RootObject>(jsonData);
// Record the data
while (worker.IsBusy) Thread.Sleep(5); // wait for the webClient to be free
ClientQueue.Add(worker);
}
私は、このエラーメッセージが出ます:
Webクライアントが同時I/O操作をサポートしていませんが。
他のスレッド:
ここでは、問題が
にクライアントがWebClient.IsBusy = false
まで待つことであることを示唆しているが、私はキューにWebクライアントをバックputing前にこれをやって答えます。私はそれが新しいWebクライアントをインスタンス化することを提案ここで https://stackoverflow.com/a/7474959/2132352IsBusy=false
https://stackoverflow.com/a/9765812/7111121自体を行った後、新しい要求を実行できない理由はここにそれがプロセスを最適化するために、リサイクルwebclientsを使用することを示唆して
を理解していません(もちろん簡単な解決策ですが、私はオブジェクトが使用する方法を隠す何かを望まない)。それはまた、操作をキャンセルすることを示唆していますが、これは助けにはなりません。
はどのようにあなたは私が見るに質問を編集した、[OK]キュー – Bigsby
を充填している私たちを表示しますより多くのコード – aam