私はコールAPIにWindowsサービスを使用しています.Sqlテーブルで応答と更新を取得しています。うまくいきましたが、しばらくヒットAPIが2回あります。私は後ろに理由がありません。私が間違ってつもりであるのはここ、ここproccessQueされる私のコードWindowsサービスヒットAPI複数回時々
protected override void OnStart(string[] args)
{
this.timer = new System.Timers.Timer(15000D);
this.timer.AutoReset = true;
this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
this.timer.Start();
}
protected override void OnStop()
{
this.timer.Stop();
this.timer = null;
}
protected void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.proccessQue();
}
されており、()メソッド
//SELECT record form table
SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM TABLE_NAME WHERE is_done=0 AND date>DATEADD(minute,-5,GETDATE())", conn);
DataTable dt = new DataTable();
adap.Fill(dt);
for (int i = 0; i < dt.Rows.Count; i++)
{
string parameters= dt.Rows[i]["parameters"] + "";
string api = "http://domain.com/page.aspx?parameters=" + parameters;
HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(api);
HttpWebResponse httpres = (HttpWebResponse)httpreq.GetResponse();
StreamReader sr = new StreamReader(httpres.GetResponseStream());
string results = sr.ReadToEnd();
sr.Close();
if (results.Contains("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"))
{
try
{
string response= "";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(results);
var res2 = xmlDoc.SelectNodes("RechargeRequest/RequestResponse/APIRef");
if (res2 != null)
response= res2[0].InnerText;
SqlCommand cmd = new SqlCommand("UPDATE TABLE_NAME SET field='" + response+ "',is_done=1 WHERE id=" + rId, conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
}
}
}
は私を助けてください。
複数のもの1. API呼び出しがレコードのループ内にあります。あなたのループの結果に基づいて、0-n回ヒットします。クエリが複数のメソッドを返す可能性があります。 2. processQueueメソッドがタイマーの各経過イベントよりも時間がかかる可能性はありますか?私の提案は1になるだろう。2つ以上のレコードを返す可能性があるので、クエリの結果を確認します。2.経過イベントでタイマーを停止してキューを処理し、再起動します。最後に、これは2017ですが、非同期/待機パターンを使用し、Web要求に対してより堅牢なHttpClientクラスを使用する方がよいでしょう。 – Nico
ああ、最後にあなたはかなりの数のIDisposableが処分されていない – Nico
はい可能です。クエリは1つ以上の行を返します。経過イベントでタイマーを停止する方法は、キューを処理し、それを再起動しますか?私を助けてください。私は充電時間のためにタイマーの経過時間を増やすことができないので、充電のウェブサイトのためにこのサービスを使用しています。 –