Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么HttpClient不能在BackgroundWorker中工作?_C#_Backgroundworker - Fatal编程技术网

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()。但在这种情况下,我仍然需要一个线程,因为我不想等待(即使它是一个控制台应用程序)直到请求完成。好的,那么就不要调用阻塞的结果。我这样做只是为了让主线程保持活动状态,这是进程不退出所必需的。