[英]multithreading in C# 5.0
我有以下要求:
有一些網址,應該下載。
如何在C#5.0上做到這一點? 我嘗試做以下事情:
class Program
{
static Stopwatch sw = Stopwatch.StartNew();
static void Main(string[] args)
{
List<Task> tasks = new List<Task>();
string[] urls = new string[] { "http://site1.ru", "http://www.site2.com", "http://site3.com", "http://site4.ru" };
foreach (var url in urls)
{
var task = AsyncVersion(url);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
}
static async Task AsyncVersion(string url)
{
var webRequest = WebRequest.Create(url);
Console.WriteLine(
"Перед вызовом webRequest.GetResponseAsync(). Thread Id: {0}, Url : {1}",
Thread.CurrentThread.ManagedThreadId, url);
var webResponse = await webRequest.GetResponseAsync();
Console.WriteLine("{0} : {1}, elapsed {2}ms. Thread Id: {3}", url,
webResponse.ContentLength, sw.ElapsedMilliseconds,
Thread.CurrentThread.ManagedThreadId);
}
}
哪些部分我不明白:
這看起來像Parallel.ForEach()
的理想工作
您可以通過參數設置並發限制,然后在等待響應太長時間后使用WebRequest.Timeout
屬性進行保釋。
像這樣的東西:
Parallel.ForEach(
urls,
new ParallelOptions { MaxDegreeOfParallelism = 3 },
url =>
{
try
{
var request = WebRequest.Create( url );
request.Timeout = 10000; // milliseconds
var response = request.GetResponse();
// handle response
}
catch ( WebException x )
{
// timeout or some other problem with the request
}
catch ( Exception x )
{
// make sure this Action doesn't ever let an exception
// escape as that would stop the whole ForEach loop
}
}
);
對Parallel.ForEach()
的調用將阻塞調用線程,直到所有URL都被處理完畢。
但是,它將使用MaxDegreeOfParallelism
線程來運行工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.