C# 为什么HttpClient不能在BackgroundWorker中工作?
这是密码C# 为什么HttpClient不能在BackgroundWorker中工作?,c#,backgroundworker,C#,Backgroundworker,这是密码 static BackgroundWorker worker = new BackgroundWorker(); static void Main(string[] args) { worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.RunWorkerAsync(); Console.ReadLine(); }
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
立即返回,导致BackgroundWorker
认为工作已经完成<代码>BackgroundWorker已与Wait一起过时。删除所有这些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 void Main(字符串[]args)
{
Console.ReadLine(worker_DoWork().Result);//故意在这里阻塞
}
静态异步任务辅助程序\u DoWork()
{
var client=新的HttpClient();
字符串httpResult=await client.GetStringAsync(“http://ozgurakpinar.net/androidserver.aspx?param=accenture2");
返回httpResult;
}
异步和线程是危险的工具。在需要时使用,而不是默认情况下使用。我不确定异步void DoWork是否是一个好主意您所说的“它在GetStringAsync行中永远等待”是什么意思?你的申请被挂了?如我所见,您的代码具有竞争条件:它可以在从web服务器检索字符串之前打印结果。@PetSerAl不应该“等待”直到我从服务器获得结果吗?@Damien_不信者,那么我如何才能完成这么简单的任务?线程对我来说很难处理回调。谢谢你在第一条中的解释。这很有帮助。数字2也很有用,因为console应用程序中的线程不需要处理程序来访问console.Writeline()。但在这种情况下,我仍然需要一个线程,因为我不想等待(即使它是一个控制台应用程序)直到请求完成。好的,那么就不要调用阻塞的结果。我这样做只是为了让主线程保持活动状态,这是进程不退出所必需的。