为什么 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 时它会起作用。
你的误解:
async void
returns 立即导致 BackgroundWorker
认为工作已完成。 BackgroundWorker
在 await 中已过时。删除所有这些。
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;
}
异步和线程是危险的工具。需要时使用,默认情况下不使用。
这是代码
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 时它会起作用。
你的误解:
async void
returns 立即导致BackgroundWorker
认为工作已完成。BackgroundWorker
在 await 中已过时。删除所有这些。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;
}
异步和线程是危险的工具。需要时使用,默认情况下不使用。