2015-07-07 2 views
16

में कॉल मैं follwing http अनुरोध विधिडीबगर HttpClient.GetAsync async के बाद बंद हो जाता है() दृश्य स्टूडियो

public async Task<HttpContent> Get(string url) 
    { 
     using (HttpClient client = new HttpClient()) 
// breakpoint 
     using (HttpResponseMessage response = await client.GetAsync(url)) 
// can't reach anything below this point 
     using (HttpContent content = response.Content) 
     { 
      return content; 
     } 
    } 

हालांकि, डिबगर 2 टिप्पणी नीचे दिए गए कोड लंघन किया जा रहा है परीक्षण करने के लिए कोशिश कर रहा हूँ। मैं विजुअल स्टूडियो 2015 आरसी, किसी भी विचार का उपयोग कर रहा हूँ? मैं भी कार्य विंडो जाँच करने की कोशिश की और कुछ भी नहीं देखा था

संपादित करें: मिला समाधान

using System; 
using System.Net.Http; 
using System.Threading.Tasks; 

namespace ConsoleTests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program program = new Program(); 
      var content = program.Get(@"http://www.google.com"); 
      Console.WriteLine("Program finished"); 
     } 

     public async Task<HttpContent> Get(string url) 
     { 
      using (HttpClient client = new HttpClient()) 
      using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false)) 
      using (HttpContent content = response.Content) 
      { 
       return content; 
      } 
     } 
    } 
} 

बाहर कर देता है कि क्योंकि यह एक सी # कंसोल अनुप्रयोग यह समाप्त हो गया के बाद मुख्य थ्रेड समाप्त होता है मुझे लगता है कि, क्योंकि एक जोड़ने के बाद था कंसोल। रीडलाइन() और थोड़ा इंतजार, अनुरोध वापस आ गया। मैंने अनुमान लगाया कि सी # मेरे कार्य निष्पादित होने तक प्रतीक्षा करेगा और इससे पहले खत्म नहीं होगा, लेकिन मुझे लगता है कि मैं गलत था। अगर कोई यह बता सकता है कि ऐसा क्यों हुआ तो यह अच्छा होगा।

+0

ऐसा इसलिए है क्योंकि आपके पास एक और async विधि 'client.GetAsync (url)' है। आपको उस विधि के अंदर ब्रेकपॉइंट भी जोड़ना चाहिए। –

+0

मुझे ब्रेकपॉइंट बिल्कुल कहां जोड़ना चाहिए? मैंने अपनी लाइन विधि को प्रतीक्षा करने के लिए हर पंक्ति पर ब्रेकपॉइंट जोड़ने की कोशिश की, लेकिन डीबगर अभी भी मेरे दूसरे GetAsync कॉल से परे कुछ भी छोड़ देता है। –

+0

@sgarcia: मेरा मानना ​​है कि यह प्रश्न एक डुप्लिकेट है। हालांकि, अगर यह गलत है, तो बस मुझे बताएं और मैं फिर से खोलूंगा। –

उत्तर

23

जब Main निकलता है, तो कार्यक्रम निकलता है। कोई भी उत्कृष्ट एसिंक्रोनस ऑपरेशंस रद्द कर दिया गया है और उनके परिणाम त्याग दिए गए हैं।

static void Main(string[] args) 
{ 
    Program program = new Program(); 
    var content = program.Get(@"http://www.google.com").Wait(); 
    Console.WriteLine("Program finished"); 
} 

एक आम दृष्टिकोण:

तो, आप बाहर निकलने से Main ब्लॉक करने के लिए, या तो अतुल्यकालिक आपरेशन या किसी अन्य विधि पर अवरुद्ध (जैसे, जब तक उपयोगकर्ता एक महत्वपूर्ण हिट ब्लॉक करने के लिए बुला Console.ReadKey) द्वारा की जरूरत है एक MainAsync कि अपवाद संचालन के रूप में अच्छी तरह परिभाषित करने के लिए है:

static void Main(string[] args) 
{ 
    MainAsync().Wait(); 
} 

static async Task MainAsync() 
{ 
    try 
    { 
    Program program = new Program(); 
    var content = await program.Get(@"http://www.google.com"); 
    Console.WriteLine("Program finished"); 
    } 
    catch (Exception ex) 
    { 
    Console.WriteLine(ex); 
    } 
} 

ध्यान दें कि एसिंक्रोनस कोड पर अवरुद्ध आम तौर पर एक बुरा विचार माना जाता है; बहुत कम मामले हैं जहां इसे किया जाना चाहिए, और एक कंसोल एप्लिकेशन की Main विधि बस उनमें से एक होती है।

+1

धन्यवाद स्टीफन।मैंने आपके कोड का उपयोग करके मेरी समस्या को ठीक किया है (पहली बार भी नहीं)। यह ओपी के समान नहीं था: सिंक्रोनस निष्पादन से पहले भी मेरा डीबगर बंद हो गया था, जो मुख्य() 'के अंत तक पहुंच गया था। मैंने एक 'MainAsync' बनाया और आपके उदाहरण के अनुसार' .Wait() 'का उपयोग किया और अचानक यह सब ठीक हो गया। ऐसा लगता है कि एसिंक कोड को सख्ती से सही तरीके से बुलाया जाना चाहिए। – OutstandingBill

+0

इसी प्रकार। आपकी प्रोफ़ाइल में आपके पास बिटकॉइन दान पता होना चाहिए। – Sentinel

+0

मुझे एसिंक डब्ल्यूसीएफ सेवा के साथ एक ही समस्या थी। भले ही मेरी सेवा विधि एसिंक थी और मैं प्रत्येक एसिंक कॉल में प्रतीक्षा कर रहा था, जब एक अपवाद हुआ, तो डीबग चुपचाप निकल गया, मैंने उस कोड में 'पकड़ने का प्रयास किया' जो गलती कर रहा था, और वहां नहीं पढ़ा। मैं बस 'void' के बजाय' कार्य 'वापस करने के लिए अपनी async सेवा विधि को बदलना भूल गया। इसके बाद, अपवाद पकड़ा जाता है (यह 'पकड़' ब्लॉक के अंदर मेरे ब्रेकपॉइंट तक पहुंचता है), और अपवाद को पहली कॉलर विधि (जिसे मैंने शून्य से कार्य में वापस कर दिया है) में प्रचारित किया जाता है। – Alisson

संबंधित मुद्दे