2015-04-17 42 views
0

如何从异步方法获取结果?从windows phone中的异步方法获取结果

async Task<string> Get(string Url) 
    { 
     HttpClient httpClient = new HttpClient(); 
     httpClient.MaxResponseContentBufferSize = 10485760; 
     httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); 
     HttpResponseMessage response = await httpClient.GetAsync(Url); 
     return await response.Content.ReadAsStringAsync(); 
    } 

调用该方法

var a = Get(address).Result; 
Outbox.Text = a; 

时,试图得到结果,在输出winodow我得到 “线程0xdf4已与代码0(为0x0)退出”

并没有什么happend

但我可以通过这种方式得到结果

async Task Get(string Url) 
    { 
     HttpClient httpClient = new HttpClient(); 
     httpClient.MaxResponseContentBufferSize = 10485760; 
     httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); 
     HttpResponseMessage response = await httpClient.GetAsync(Url); 
     Outbox.Text = response.Content.ReadAsStringAsync().Result; 
    } 

,并通过这种方式

var a = Get(address); 

我尝试在Windows Phone 8.1的代码调用该方法。 谢谢。

回答

1

在大多数情况下,调用异步方法时,你应该等待它:

var a = await Get(address); 
Outbox.Text = a; 

调用.Result在技术上是有效的,但你冻结调用线程,这有时会导致死锁(就像你的样品)。

+0

我之前试过这个,'await'操作符只能在异步方法中使用 –

+0

这就意味着你需要在你的方法签名中添加'async'关键字。例如,如果你有'public void Button_Click(...)',把它改为'public async void Button_Click(...)' –

+0

yup,它可以工作。非常感谢 –