J'ai cet appel asynchrone simple que je fais. Je veux suivre l'appel à la méthode DownloadDataTaskAsync
et passer à travers dans le code source Microsoft .NET Framework.Visual Studio Debugger ne pas entrer dans le code source de l'infrastructure .NET
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;
}
}
}
J'ai suivi l'appel à réflecteur jusqu'au point que le code appelle la méthode System.Net.WebClient.DownloadBits
. Si l'appel devait être exécuté de manière asynchrone, cette méthode programme en outre le travail sur un thread threadpool en appelant la méthode APM (Asynchronous Programming Model) BeginGetResponse
sur la classe .
Voici le code de la méthode DownloadBits
de 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;
}
Alors, je mis en place deux points d'arrêt dans Visual Studio:
1) L'un sur la méthode Sytem.Net.WebClient.DownloadBits
; et l'autre
2) Sur la méthode System.Net.WebRequest.BeginGetResponse
.
J'ai vérifié ce qui suit.
1) que je configuré les Debugging paramètres dans les Visual Studio Tools -> Options dialogue permettant correctement le débogueur pour parcourir la source du framework .NET.
2) que j'avais permis le téléchargement et la mise en cache des symboles de débogage à un emplacement approprié.
3) J'ai vérifié l'emplacement et vu qu'il y avait des symboles de débogage pour tous les ensembles mon code référencé et en particulier pour les System.dll
qui avait les méthodes que mes points d'arrêt ont été définies sur.
Cependant, quand je courais le code avec le débogage sur, il se plaint qu'il ne pouvait pas trouver les symboles de débogage pour System.dll
. J'ai donc cliqué sur le bouton Charger pour le télécharger à l'exécution à partir du Microsoft Symbol Server.
Même alors, alors qu'il a fait casser à la méthode DownloadBits
, comme je l'ai vu de la pile des appels fenêtre et du message qu'il imprime dans la fenêtre de sortie que je l'avais demandé à imprimer lors de la mise en place du point d'arrêt, il n'a pas montré ou n'a pas pénétré dans la source de cette méthode.
je cliqué, bouton droit de la pile cadre de la méthode DownloadBits
dans la pile des appels fenêtre à cliquer sur les symboles de charge élément de menu, mais il n'y était pas. Par conséquent, l'élément de menu Aller au code source a également été désactivé.
je franchis le cache et laissez-le télécharger à nouveau toutes les assemblées, mais qui n'a pas aidé non plus. J'utilise Visual Studio Community Edition 2015 et mon programme cible la version 4.5.2 du framework .NET et j'ai déjà été capable de monter dans des assemblys sources .NET en utilisant cette configuration plusieurs fois.
Qu'est-ce que j'ai manqué?
Le site Web de la source de référence était désynchronisé depuis la mise à jour .NET fournie via Windows Update vers le 22 avril. Une mésaventure très commune, diagnostiquer avec les conseils fournis dans [ce post] (http://stackoverflow.com/a/27655501/17034) .. –
@HansPassant Merci beaucoup. En cliquant sur ** Informations de chargement de symbole ** dans le menu contextuel de la fenêtre ** Modules **, la boîte de dialogue ** Informations sur le chargement des symboles ** indique qu'il était capable de charger les symboles de débogage de 'System.dll' depuis mon ordinateur local cache Cependant, il ne marche toujours pas dans la source. –
@HansPassant BTW, a augmenté l'élément Voix de l'utilisateur de 3 votes. :-) –