7

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

enter image description here

2) Sur la méthode System.Net.WebRequest.BeginGetResponse.

enter image description here

enter image description here

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.

enter image description here

2) que j'avais permis le téléchargement et la mise en cache des symboles de débogage à un emplacement approprié.

enter image description here

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.

enter image description here

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.

enter image description here

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.

enter image description here

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é.

enter image description here

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é?

+2

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) .. –

+0

@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. –

+0

@HansPassant BTW, a augmenté l'élément Voix de l'utilisateur de 3 votes. :-) –

Répondre

0

Vous pouvez essayer d'utiliser un serveur de symboles à la volée avec dotPeek. Il va décompiler les assemblées et agir comme un serveur de symboles normal.

Configurez le serveur de symboles dans dotPeek (Outils -> Serveur de symboles). Copiez l'adresse du serveur de symboles dans le presse-papiers.

Ajoutez ce serveur de symboles à Visual Studio et supprimez l'autre (ou simplement le désactiver). Attention, le chargement de tous les assemblages .NET peut prendre beaucoup de temps. Vous pouvez le modifier en choisissant l'option Assemblies opened in the Assembly Explorer dans dotPeek.