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
2) Auf der System.Net.WebRequest.BeginGetResponse
Methode.
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.
2) Dass ich das Herunterladen und Caching von Debug-Symbole an einer geeigneten Stelle aktiviert hatte.
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.
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.
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.
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.
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?
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) .. –
@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. –
@HansPassant BTW, Upvoted der User Voice-Artikel um 3 Stimmen. :-) –