私はF11デバッグを使用すると、NetStatus
値はtrue
ですが、私はF5デバッグを使用する場合、NetStatus
値はfalse
です。どうして?どうすれば修正できますか?C#TimerCallback戻り値エラー
_connect
の値が何時変わるか分かりません。 これはマルチスレッド同期の問題ですか?
namespace conn
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class Program
{
static void Main(string[] args)
{
wait_conn();
}
private static void wait_conn()
{
bool NetStatus = false;
string DataS = "127.0.0.1";
CheckIpConn conn = new CheckIpConn();
conn.CheckIp(DataS);
//Thread.Sleep(3000);
NetStatus = conn.Connected;
if (!NetStatus)
Console.WriteLine(conn.Connected.ToString());
Console.Read();
}
}
public class CheckIpConn
{
private int _port = 135;
private volatile bool _connect;
private IPEndPoint _iPEndPoint;
private TcpClient _client;
private TimerCallback _timerCallBack;
private System.Threading.Timer _timer;
public bool Connected
{
get { return _connect; }
}
public void CheckIp(string Ip)
{
_iPEndPoint = new IPEndPoint(IPAddress.Parse(Ip), _port);
_timerCallBack = new TimerCallback(CheckConnect);
_timer = new System.Threading.Timer(_timerCallBack, null, 10, 1000);
_timer.Dispose();
}
public void CheckConnect(object o)
{
try
{
_client = new TcpClient();
_client.Connect(_iPEndPoint);
_connect = true;
_client.Close();
}
catch
{
_connect = false;
}
}
}
}
私は見る!私はThread.Sleep(300)を追加します。 conn.Connectedの前に、Thread.Sleep(2000)を追加します。 before _timer.Dispose();今、それは仕事です!ありがとうございます! – flyingnn
@flyingnn:それは良い解決策ではありません。それは基本的に接続をチェックするのが遅く信頼できない方法です...私が言ったように、あなたは本当に非同期的なアプローチ*を適切にしたいのでなければ、同期アプローチを使うことを強く勧めます。 'Sleep'呼び出しでコードをペーストすることは、信頼できるシステムに到達する良い方法ではありません。 –
私はC#初心者です。私はそれがSQLポートに接続する前に、ターゲットのホストのネットワークの状態を確認したい。それ以外の場合、SQL SERVERがダウンすると、ユーザーは20-30秒待機します。 – flyingnn