为什么HttpClient不能在后台工作

本文关键字:后台 工作 不能 HttpClient 为什么 | 更新日期: 2023-09-27 18:05:10

代码

static BackgroundWorker worker = new BackgroundWorker();
static void Main(string[] args)
{
    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.RunWorkerAsync();
    Console.ReadLine();
}
static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Console.WriteLine(e.Result);
}
public static async void worker_DoWork(object sender, DoWorkEventArgs e)
{
    var client = new HttpClient();
    string httpResult = await client.GetStringAsync("http://ozgurakpinar.net/androidserver.aspx?param=accenture2");
    e.Result = httpResult;
}

在GetStringAsync行中永远等待。但是,当我使用线程而不是BackgroundWorker时,它会工作。

为什么HttpClient不能在后台工作

你的误解:

  1. async void立即返回,导致BackgroundWorker认为工作完成。BackgroundWorker已被await淘汰。
  2. BackgroundWorker在控制台应用程序中没有意义。

当你扔掉所有不需要的东西时,这实际上很简单:

static void Main(string[] args)
{
    Console.ReadLine(worker_DoWork().Result); //intentionally blocking here
}
static async Task<string> worker_DoWork()
{
    var client = new HttpClient();
    string httpResult = await client.GetStringAsync("http://ozgurakpinar.net/androidserver.aspx?param=accenture2");
    return httpResult;
}
异步和线程是危险的工具。