7

Ich habe diese einfache Async-Aufruf, den ich mache. Ich möchte dem Aufruf der DownloadDataTaskAsync-Methode folgen und in den Quellcode von Microsoft .NET Framework gehen.Visual Studio-Debugger tritt nicht in .NET-Framework-Quellcode

using System; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 

namespace WhereIsTheTaskSchedulerHere 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var task = GetData("http://sathyaish.net"); 
      var buffer = task.Result; 

      var data = Encoding.ASCII.GetString(buffer); 

      Console.WriteLine(data); 
      Console.WriteLine("\nPress any key to continue..."); 
      Console.ReadKey(); 
     } 

     async static Task<byte[]> GetData(string url) 
     { 
      var client = new WebClient(); 
      var data = await client.DownloadDataTaskAsync(url); 
      return data; 
     } 
    } 
} 

Ich folgte dem Ruf in Reflector bis zu dem Punkt, dass der Code System.Net.WebClient.DownloadBits Methode aufruft. Wenn der Aufruf asynchron ausgeführt werden soll, plant diese Methode die Arbeit an einem Threadpool-Thread weiter, indem sie die Methode des asynchronen Programmiermodells (APM) BeginGetResponse in der Klasse System.Net.WebRequest aufruft.

Hier ist der Code der DownloadBits Methode von Reflector.

private byte[] DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp) 
{ 
    WebResponse response = null; 
    DownloadBitsState state = new DownloadBitsState(request, writeStream, completionDelegate, asyncOp, this.m_Progress, this); 
    if (state.Async) 
    { 
     request.BeginGetResponse(new AsyncCallback(WebClient.DownloadBitsResponseCallback), state); 
     return null; 
    } 
    response = this.m_WebResponse = this.GetWebResponse(request); 
    int bytesRetrieved = state.SetResponse(response); 
    while (!state.RetrieveBytes(ref bytesRetrieved)) 
    { 
    } 
    state.Close(); 
    return state.InnerBuffer; 
} 

Also, habe ich zwei Haltepunkte in Visual Studio up:

1) Eine auf dem Sytem.Net.WebClient.DownloadBits Verfahren; und die anderen

enter image description here

2) Auf der System.Net.WebRequest.BeginGetResponse Methode.

enter image description here

enter image description here

ich folgendes doppelt geprüft.

1), dass ich die Debuggen Einstellungen in den Visual Studio-Tools konfiguriert -> Optionen korrekt Dialog der Debugger ermöglicht .NET Framework Quelle zu Schritt durch.

enter image description here

2) Dass ich das Herunterladen und Caching von Debug-Symbole an einer geeigneten Stelle aktiviert hatte.

enter image description here

3) ich die Lage doppelt geprüft und sah, dass es meinen Code Debug-Symbole für alle Baugruppen waren die System.dll verwiesen und vor allem für die die Verfahren hatte die meine Haltepunkte wurden festgelegt auf.

enter image description here

Allerdings, wenn ich den Code mit dem Debuggen auf lief, klagte er, dass es nicht die Debug-Symbole für System.dll finden kann. Also habe ich auf die Schaltfläche "Laden" geklickt, um sie zur Laufzeit vom Microsoft Symbol Server herunterladen zu lassen.

enter image description here

Selbst dann, während es tat am DownloadBits Verfahren brechen, wie ich aus den Call Stack Fenstern sah und aus der Nachricht in den Ausgabefenstern gedruckt, dass ich es zu drucken gebeten hatte während des Einrichtens des Haltepunkts wurde die Quelle dieser Methode nicht angezeigt oder betreten.

enter image description here

ich den Stapel-Rahmen der DownloadBits Methode in der Call Stack Window-rechts geklickt die laden Symbole Menüpunkt zu klicken, aber es war nicht da. Folglich wurde auch der Menüeintrag Gehe zu Quellcode deaktiviert.

enter image description here

ich den Cache gelöscht und lassen Sie es alle Baugruppen neu aber herunterladen, die entweder nicht geholfen hat.

Ich verwende Visual Studio Community Edition 2015 und mein Programm zielt auf v4.5.2 des .NET-Frameworks ab, und ich war bereits in der Lage, mit dieser Einrichtung viele Male in .NET-Quellassemblies einzutauchen.

Was habe ich vermisst?

+2

Die Referenzquelle-Website ist seit der Auslieferung eines .NET-Updates durch Windows Update um den 22. April nicht mehr synchron. Ein sehr häufiges Missgeschick, diagnostizieren Sie mit den Hinweisen in [diesem Beitrag] (http://stackoverflow.com/a/27655501/17034) .. –

+0

@HansPassant Vielen Dank. Beim Klicken auf ** Symbol laden Informationen ** aus dem Kontextmenü im Fenster ** Module ** meldet das Dialogfeld ** Symbol laden Information **, dass es die Debugsymbole für 'System.dll' von meinem lokalen laden konnte Zwischenspeicher. Es tritt jedoch immer noch nicht in die Quelle ein. –

+0

@HansPassant BTW, Upvoted der User Voice-Artikel um 3 Stimmen. :-) –

Antwort

0

Sie können versuchen, einen On-the-Fly-Symbolserver mit dotPeek zu verwenden. Es wird die Assemblies dekompilieren und als normaler Symbol Server fungieren.

Richten Sie den Symbolserver in dotPeek (Extras -> Symbol Server) ein. Kopieren Sie die Symbol Server Adresse in die Zwischenablage.

Fügen Sie Visual Studio diesen Symbolserver hinzu, und entfernen Sie den anderen Server (oder deaktivieren Sie ihn einfach).

Beachten Sie, dass das Laden aller .NET-Assemblys lange dauern kann. Sie können es optimieren, indem Sie in DotPeek die Option Assemblies opened in the Assembly Explorer auswählen.