为什么 HttpClient 在 BackgroundWorker 中不起作用?

Why does not HttpClient work in BackgroundWorker?

这是代码

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 时它会起作用。

你的误解:

  1. async void returns 立即导致 BackgroundWorker 认为工作已完成。 BackgroundWorker 在 await 中已过时。删除所有这些。
  2. BackgroundWorker 在控制台应用程序中没有意义。它是为 UI 制作的组件。

扔掉所有不需要的东西其实很简单:

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;
}

异步和线程是危险的工具。需要时使用,默认情况下不使用。