C# WebClient是否应在using语句中使用?

C# WebClient是否应在using语句中使用?,c#,httpclient,webclient,using,C#,Httpclient,Webclient,Using,如果HttpClient不应在using语句中使用,请参阅以下链接: 所以,如果您不应该在using语句中使用HttpClient,那么为什么有那么多示例将WebClient放在using语句中(包括微软);另外,我还没有看到一篇关于不使用语句将WebClient置于中的文章?最终,在最低级别,WebClient和HttpClient都会在同一个位置打开TCP/IP套接字。使用语句输入一个,这是否是WebClient可以接受的 注意:我有理由问这个问题:我有一个运行在WinXP、Win7完整和

如果HttpClient不应在using语句中使用,请参阅以下链接:

所以,如果您不应该在using语句中使用HttpClient,那么为什么有那么多示例将WebClient放在using语句中(包括微软);另外,我还没有看到一篇关于不使用语句将WebClient置于中的文章?最终,在最低级别,WebClient和HttpClient都会在同一个位置打开TCP/IP套接字。使用语句输入一个,这是否是WebClient可以接受的

注意:我有理由问这个问题:我有一个运行在WinXP、Win7完整和嵌入式系统上的客户端应用程序,我用来将XML发布到后端主机(CentOS系统)的代码如下所示:

void PostXml(string url, string xml, int id) {
    try
    {
        //Console.WriteLine("POST Request: " + xml);
        using (WebClient wc = new WebClient())
        {
            wc.Proxy = null;    //DEBUG: testing this to see if it helps webclient post failure after time x
            wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            Byte[] d = Encoding.ASCII.GetBytes(xml);

            //however Async below is better regardless for closing app and non interference with GUI
            //Byte[] res = web.UploadData(url, "POST", d);  //sychrounous will block until sent and response returned

            wc.UploadDataCompleted += new UploadDataCompletedEventHandler(web_UploadDataCompleted);
            wc.UploadDataAsync(new Uri(url), "POST", d, id);
        }
    }
    catch (WebException ex)
    {
        string responseText = "";
        using (var reader = new StreamReader(ex.Response.GetResponseStream()))
        {
            responseText = reader.ReadToEnd();
        }
        string logMsg = DateTime.Now.ToString("s") + " - PostXml WebClient webexception: " + ex.Message + "\r\n" +
            "  response: " + responseText + "\r\n\r\n";
        File.AppendAllText(SPUClient.frmMain._logFile, logMsg);
    }
    catch (Exception ex) {
        //Console.WriteLine("PostXml Exception: " + ex.Message);
        string logMsg = DateTime.Now.ToString("s") + " - PostXml exception: " + ex.Message + "\r\n";
        File.AppendAllText(SPUClient.frmMain._logFile, logMsg);
    }
}

PostXml每1分钟调用2次,我有400个客户机在这个领域运行上面的代码,其中一些已经运行了一年多没有错误。但是我们有一些客户机在运行了几周后运行了这段代码,或者几个月后就停止了UploadDataAsync(“POST”)的工作?我们现在所知道的是,我们没有收到异常,POST消息没有离开计算机,在我的CentOS日志文件中,我可以看到它从未到达(CentOS上的domain.net.access.log显示了我所有客户端的所有POST连接)。请记住,这种情况很少发生,有些客户从未失败过,有些客户在失败之前运行了数月/数周。重新启动客户端应用程序当然可以解决问题。我应该在using语句中使用WebClient吗?这可能是导致类似此问题的原因,还是其他原因?

如果存在“视情况而定”的情况,则是这种情况。鉴于您在异步操作完成之前进行处理,这似乎不太可能是正确的用法。此外,错误可能会出现在事件处理程序的参数中,而不是此方法中。@mikez-你是说我不应该将WebClient放入using语句中-但就像我说的那样,我的代码在很长一段时间内工作正常,一些运行此代码的客户端从未失败过?在我看来,WebClient很可能在异步回调函数被调用之前就被处理掉了,但它可以工作。我可以在VS2015中调试它,它总是正确地命中回调。@mikez-我也检查了回调函数web_UploadDataCompleted中的EventArgs e.Error,并在其中尝试捕获以记录异常。然而,我只是添加了日志记录,如果e.Error不是null,那么如果这种情况再次发生,我可能会看到一些东西?实际上,查看WebClient的代码,我发现它是从组件派生的,这就是Dispose的来源。WebClient本身似乎没有使用此功能,事实上,您可以处理WebClient实例并继续使用它进行调用,因此我怀疑任何有关
使用
的问题都是一种误导。