我正在使用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秒内像发送请求一样发送请求。 我不确定异步,等待和任务是否正确使用。
谢谢
答案 0 :(得分:2)
如果您能够在一段时间内执行请求 ,然后失败,则您可能已经用尽了可用的套接字数量。当我们为每个请求重复创建并处理一个HttpClient
时,就会发生这种情况。
相反,我们应该创建HttpClient
并尽可能长地重用它。从技术上讲,我们应该在处理完它后再处理它,因为它实现了IDisposable
,但是只要我们继续重复使用它,就不会使用它。因此,使用和处置它的正确方法还不是100%清楚。
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引起了我的注意。