Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# 自动重试连接_C#_.net_Tcpclient - Fatal编程技术网

C# 自动重试连接

C# 自动重试连接,c#,.net,tcpclient,C#,.net,Tcpclient,我正在尝试使用TCPCLIENT通过.NET构建一个检查器 对于每封检查我的应用程序的电子邮件,我的服务器和smtp服务器之间都建立了连接,这意味着smtp服务器有时没有响应 我想问的问题是如何不断尝试连接 如果没有接通 这是我的密码: TcpClient tClient = new TcpClient("smtp-in.orange.fr", 25); string CRLF = "\r\n"; byte[] dataBuffer; string ResponseString; Networ

我正在尝试使用TCPCLIENT通过.NET构建一个检查器

对于每封检查我的应用程序的电子邮件,我的服务器和smtp服务器之间都建立了连接,这意味着smtp服务器有时没有响应

我想问的问题是如何不断尝试连接 如果没有接通

这是我的密码:

TcpClient tClient = new TcpClient("smtp-in.orange.fr", 25);
string CRLF = "\r\n";
byte[] dataBuffer;

string ResponseString;
NetworkStream netStream = tClient.GetStream();
StreamReader reader = new StreamReader(netStream);
ResponseString = reader.ReadLine();

/* Perform HELO to SMTP Server and get Response */
dataBuffer = BytesFromString("HELO KirtanHere" + CRLF);
netStream.Write(dataBuffer, 0, dataBuffer.Length);
ResponseString = reader.ReadLine();
dataBuffer = BytesFromString("mail from:<contact@contact.com>" + CRLF);
netStream.Write(dataBuffer, 0, dataBuffer.Length);
ResponseString = reader.ReadLine();
TcpClient tClient=新的TcpClient(“smtp in.orange.fr”,25);
字符串CRLF=“\r\n”;
字节[]数据缓冲;
弦乐;
NetworkStream netStream=tClient.GetStream();
StreamReader=新的StreamReader(netStream);
ResponseString=reader.ReadLine();
/*对SMTP服务器执行HELO并获取响应*/
dataBuffer=BytesFromString(“HELO KirtanHere”+CRLF);
Write(dataBuffer,0,dataBuffer.Length);
ResponseString=reader.ReadLine();
dataBuffer=BytesFromString(“邮件发件人:+CRLF”);
Write(dataBuffer,0,dataBuffer.Length);
ResponseString=reader.ReadLine();

似乎您需要在for循环内部实现try-catch块

for (var i = 0; i < retryCount; i++)
{
   try
   {
       YourAction();
       break; // success
   }
   catch { /*ignored*/ }

   // give a little breath..
   Thread.Sleep(50); 
}

一个解决方案是使用波利图书馆

使用Polly,您需要将策略配置为您希望重试的场景

请指定您的例外策略,如下所示

var maxRetryAttempts = 3;
var pauseBetweenFailures = TimeSpan.FromSeconds(2);

var retryPolicy = Policy
    .Handle<Exception>()// Handle specific exception
    .WaitAndRetryAsync(maxRetryAttempts, i => pauseBetweenFailures);
关于如何使用Polly的详细说明,这里有一篇很好的文章

var maxRetryAttempts = 3;
var pauseBetweenFailures = TimeSpan.FromSeconds(2);

var retryPolicy = Policy
    .Handle<Exception>()// Handle specific exception
    .WaitAndRetryAsync(maxRetryAttempts, i => pauseBetweenFailures);
await retryPolicy.ExecuteAsync(async () =>
{
TcpClient tClient = new TcpClient("smtp-in.orange.fr", 25);
string CRLF = "\r\n";
byte[] dataBuffer;
.....
});