Я просто следую примеру с вызовом HttpClient в режиме синхронизации, он отлично работает в консольном приложении.Использование await on HttpClient в проекте wpf
Однако, когда я перехожу к приложению wpf, программа висит без возврата.
Я пытаюсь изолировать проблему, создав отдельный класс для обработки фиктивного запроса, чтобы посетить www.google.com.
Похоже, что приложение зависает при вызове client.GetAsync, могу ли я узнать, нужно ли что-то менять с консольного приложения на wpf в этом случае?
Пожалуйста, найти источник как консольное приложение и МОФ, как показано ниже,
Console приложение - работает отлично:
using System;
using System.Threading.Tasks;
using System.Net.Http;
namespace ca03
{
static class action
{
static async Task<string> DownloadPageAsync()
{
// ... Target page.
string page = "http://www.google.com/";
// ... Use HttpClient.
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(page))
using (HttpContent content = response.Content)
{
// ... Read the string.
string result = await content.ReadAsStringAsync();
// ... Display the result.
if (result != null &&
result.Length >= 50)
{
Console.WriteLine(result.Substring(0, 50) + "...");
}
return result;
}
}
public static string goDownload()
{
Task<string> x = DownloadPageAsync();
string result = x.Result;
return result;
}
}
class Program
{
static void Main(string[] args)
{
string data = action.goDownload();
Console.WriteLine(data);
Console.ReadLine();
}
}
}
WPF приложения (только простой проект с помощью кнопки на добавленную стоимость) - висеть в GetAsync
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Net.Http;
namespace wpf02
{
static class action
{
static async Task<string> DownloadPageAsync()
{
// ... Target page.
string page = "http://www.google.com/";
// ... Use HttpClient.
using (HttpClient client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(page))
using (HttpContent content = response.Content)
{
// ... Read the string.
string result = await content.ReadAsStringAsync();
return result;
}
}
public static string goDownload()
{
Task<string> x = DownloadPageAsync();
string result = x.Result;
return result;
}
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
string data = action.goDownload();
Console.WriteLine(data);
}
}
}
Я иду в эту проблему более подробно [на моем блоге] (http://blog.stephencleary.com/2012/07 /dont-block-on-async-code.html). –