0

ich eine HTTPS-basierte API, die ich brauche eine Menge Zeit zu nennen. Mit HttpWebRequest.Create (uri) .GetResponse() dauert von 50ms bis zu 500ms oder mehr zur Ausführung. Um die Reaktionszeit zu überprüfen implementiert ich es wie folgt aus:C# - HttpWebRequest/GetResponse -leistung

private void Action() 
{ 
    WebRequest request = HttpWebRequest.Create("https://....."); 
    using (WebResponse response = request.GetResponse()) { } 
} 

und dann ruft:

private long getTime() 
{ 
    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    Action(); 
    return sw.ElapsedMilliseconds; 
} 

Ausgang für mehrere Anrufe:

Time: 746 ms 
Time: 51 ms 
Time: 50 ms 
Time: 50 ms 
Time: 51 ms 
Time: 49 ms 
Time: 2417 ms ??? 
Time: 52 ms 
Time: 52 ms 
Time: 51 ms 
Time: 50 ms 
Time: 201 ms 
Time: 234 ms 
Time: 204 ms 
Time: 51 ms 
Time: 50 ms 
Time: 50 ms 
Time: 52 ms 
Time: 280 ms 
Time: 264 ms 

erste Frage: Ich war frage mich, ob es einen Weg gab, GetResponse zu beschleunigen, damit es so schnell wie möglich funktioniert?

Jetzt .. denn ich brauche eine Menge verschiedener Anfragen mit verschiedenen URLs zu machen, um den Prozess zu beschleunigen, entschied ich mich TPL Dataflow Block (statt Parallel.Foreach) zu verwenden, da Parallel.Foreach hauptsächlich für CPU bound Arbeit verwendet wird, und Was ich mache, ist I/O bound (es gibt auch die Verarbeitung der Antwort, also auch ein bisschen CPU-Arbeit). Und wenn ich TPL Dataflow-Block verwenden, die Verarbeitung von 250 URLs dauert bis 7 Sekunden auszuführen, während Parallel Foreach dauert 15 Sekunden oder mehr, so dass ich bin positiv TPL Datenfluß-Block-Nutzung ist der richtige Weg zu gehen. Wie ich es umgesetzt:

//CALL: 
var block = new ActionBlock<string>(uri => Action(uri), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 200 }); 
foreach (var URL in urlArray) 
{ 
    block.Post(URL); 
} 
block.Complete(); 
await block.Completion; 

//Action(uri): 
private void Action(string uri) 
{ 
    WebRequest request = HttpWebRequest.Create(uri); 
    using (WebResponse response = request.GetResponse()) { } 
} 

Und da ich mit 7s Ausführung nicht glücklich bin habe ich versucht, ServicePointManager um Tweaking es zu beschleunigen, Dinge, die ich habe versucht, so weit und nichts davon funktionierte:

ServicePointManager.UseNagleAlgorithm = false; 
ServicePointManager.Expect100Continue = false; 
ServicePointManager.SetTcpKeepAlive(false, 0, 0); 
ServicePointManager.DefaultConnectionLimit = 1000; 

Zweite Frage: Wenn es nicht möglich ist, die Beschleunigung GetResponse(), um eine schnellere Ausführung zu erreichen, ist es eine Möglichkeit, TPL Dataflow Block zwicken in eine bessere Leistung zu haben?

EDIT: Mein Ziel ist es, alle Anrufe SO SCHNELL wie möglich auszuführen.

+0

Warum verwenden Sie nicht [GetResponseAsync] (https://msdn.microsoft.com/en-us/library/system.net.webrequest.getresponseasync (v = vs.110) .aspx)? –

+0

@JeroenHeier Ich bin echt erstaunt, wie ich das vermisst habe. Wirklich einer der peinlichsten Momente meines Lebens .. Ich muss wirklich müde gewesen sein. Bitte posten Sie Ihre Antwort als Antwort. – Hubbs

Antwort

0

Sie könnten Ihre Lösung Speedup von GetResponseAsync verwenden. Siehe auch this Micorsoft Walkthrough, in dem beide Methoden (synchron und asynchron) ausführlich erklärt werden.