过一会儿抛出异常

时间:2019-04-11 15:13:52

标签: c# .net timer async-await put

我正在使用url上的put命令连接到设备。但是,安装程序要求异步命令位于计时器内部。它会运行一会儿,然后mscorlib.dll开始引发异常,并且命令将停止发送。

我试图在计时器事件处理程序中添加异步,并在调用该命令的函数之前等待,但仍会发生。不能100%知道应该怎么做,因为计时器无法等待,而且发生的时间非常快。

button click {
_updateTimer = new Timer(_updateInterval);
_updateTimer.Tick += new EventHandler(TimerUpdate_Tick);
Start
}

private async void TimerUpdate_Tick(object sender, System.EventArgs e)
{
   //do other very important stuff that has to be in timer update event
   await myfunction();
}

public static async Task myfunction()
{
    HttpClientHandler handler = new HttpClientHandler();

    using (var httpClient = new HttpClient(handler))
    {
       using (var request = new HttpRequestMessage(new HttpMethod("PUT"), address))
       {
           request.Content = new StringContent("hello");
           var response = await httpClient.SendAsync(request);
           //after some time, it gives an exception on this SendAsync saying connection closed. I did try reconnecting but still gives it again.
        }
    }            
}

我想要的是清除一些缓冲区(如果这是问题所在),并使连接保持活动状态,并在开始的15秒内像发送请求一样发送请求。 我不确定异步,等待和任务是否正确使用。

谢谢

1 个答案:

答案 0 :(得分:2)

如果您能够在一段时间内执行请求 ,然后失败,则您可能已经用尽了可用的套接字数量。当我们为每个请求重复创建并处理一个HttpClient时,就会发生这种情况。

相反,我们应该创建HttpClient并尽可能长地重用它。从技术上讲,我们应该在处理完它后再处理它,因为它实现了IDisposable,但是只要我们继续重复使用它,就不会使用它。因此,使用和处置它的正确方法还不是100%清楚。

documentation说:

  

HttpClient旨在实例化一次,并在应用程序的整个生命周期内重复使用。为每个请求实例化HttpClient类将耗尽繁重负载下可用的套接字数量。这将导致SocketException错误。下面是正确使用HttpClient的示例。

...并遵循以下示例:

public class GoodController : ApiController
{
    // OK
    private static readonly HttpClient HttpClient;

    static GoodController()
    {
        HttpClient = new HttpClient();
    }
}

另一种替代方法是使用HttpClient以外的东西。 RestSharp不仅非常易于使用,而且不使用HttpClient,因此您不必担心对其进行处理。它在内部处理了很多类似的事情。

此外,here's the fun article引起了我的注意。