C# try catch ถ้าเน็ตหลุดหรือเชื่อมต่อกับ database(เครื่อง Server) ไม่ได้ อยากให้มี countdown 30วินาที แล้วกลับมาทำงานใน Try ใหม่อีกครั้ง ทำยังไงครับ
งงคำถามกันไหมครับ สอบถามได้นะครับ คือปกติถ้ามันเชื่อมต่อไม่ได้ มันจะแสดง Popup ขึ้นมาว่าเชื่อมต่อไม่ได้ แต่ตอนนี้ผมอยากให้แสดงเป็นนับเวลาถอยหลังว่าจะเชื่อมต่อใหม่.. 30 วินาที countdown จนกว่าจะเชื่อมต่อได้ ถึงจะทำใน Try อะไรแบบนี้ครับ
Date :
2017-12-07 15:09:25
By :
nPointXer
ใช้ Timmer ครับ
Date :
2017-12-07 15:20:44
By :
OOP
ใช้ BackgroundWorker แล้วใช้ Sleep ครับ
Date :
2017-12-07 17:07:48
By :
mr.win
ถ้าใช้ timer ตั้ง interval = 30000(30s)
มันก็จะทำตามคำสั่งใน timer ทุก 30 วิกันเลยทีเดียวครับ
แล้วตอนนี้โค้ดใน timer เขียนไว้ยังไงมั่งครับ
Date :
2017-12-07 19:03:10
By :
lamaka.tor
Code (C#)
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 30000; // 30 second
private void timer1_Tick(object sender, EventArgs e)
{
Countt--;
if (Countt == 0)
{
timer1.Stop();
button1.Text = "Start";
button1.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
PrepareListView();
// backgroundWorker1.RunWorkerAsync(); ไม่ต้องมี มันซ้ำซ้อน
}
else
{
button1.Text = "Start (" + Countt.ToString() + ")";
}
}
ถ้าแบบนี้มันจะเช็คทุก 30 วิ อยู่แล้ว ครับ
timer2 มีไว้เพื่ออะไรรึครับ
Date :
2017-12-07 23:20:10
By :
lamaka.tor
หากเรายึดวัตถุประสงค์นี้
Code (C#)
try
{
//Query
}
catch (Exception ex)
{
//นับเวลาถอยหลัง 30วินาที
//เช็คการเชื่อมต่อ internet หรือ Database
//ถ้าเชื่อมต่อได้ให้กลับไปทำใน Try ใหม่
//ถ้าไม่ได้ให้นับเวลาถอยหลัง 30วินาที แล้วเช็คใหม่อีกครั้ง จนกว่าจะได้
}
สามารถ เขียนบ้านๆได้แบบนี้เลยครบั
Code (C#)
try
{
//Query
}
catch (Exception ex)
{
//นับเวลาถอยหลัง 30วินาที
//เช็คการเชื่อมต่อ internet หรือ Database
//ถ้าเชื่อมต่อได้ให้กลับไปทำใน Try ใหม่
//ถ้าไม่ได้ให้นับเวลาถอยหลัง 30วินาที แล้วเช็คใหม่อีกครั้ง จนกว่าจะได้
do
{
//เช็คการเชื่อมต่อ internet หรือ Database
//นับเวลาถอยหลัง 30วินาที
System.Threading.Thread.Sleep(30000);
} while (conn.state = System.Data.ConnectionState.Closed);
}
การใช้ Do และ Sleep(30000) บ้านๆตรงตัวตามคำถามเลยครับ
คือเช็คทุก 30 วิ จนกว่าจะคอนเนคได้ ถ้าได้ก็ ชิวๆไป ไม่ได้ก็คอนใหม่
อีก 30 วิ เจอกานนนน อะไรประมาณนั้น
แต่ในกรณที่ เราต้องการให้ เช็คการ คอนเนคทุก 30 วิ คนละความหมายกับด้านบนนะครับ
คือแบบแรก เรา คอนเนคไม่ได้ เลยต้อง รอ คอนเนคใหม่ทุก 30 วิ จนกว่าจะคอนได้
แบบที่2 คือไม่สนว่าจะคอนได้รึไม่ได้ แต่อยากให้คอนทุก 30 วิ
แบบนี้เราใช้ Timer แล้วกำหนด Interval = 30000
Code (C#)
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 30000; // 30 second
private void timer1_Tick(object sender, EventArgs e)
{
//เช็คการเชื่อมต่อ internet หรือ Database
}
แบบที่ 3 คือต้องการเช็คทุก 30 วิ แล้วถ้่าเช็คแล้วมัน คอนเน็คก็ให้ รีคอนเนคทุก 30 วิ
Code (C#)
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 30000; // 30 second
private void timer1_Tick(object sender, EventArgs e)
{
//เช็คการเชื่อมต่อ internet หรือ Database
}
void CheckConect()
{
try
{
//Query
}
catch (Exception ex)
{
//นับเวลาถอยหลัง 30วินาที
//เช็คการเชื่อมต่อ internet หรือ Database
//ถ้าเชื่อมต่อได้ให้กลับไปทำใน Try ใหม่
//ถ้าไม่ได้ให้นับเวลาถอยหลัง 30วินาที แล้วเช็คใหม่อีกครั้ง จนกว่าจะได้
do
{
//เช็คการเชื่อมต่อ internet หรือ Database
//นับเวลาถอยหลัง 30วินาที
System.Threading.Thread.Sleep(30000);
} while (conn.state = System.Data.ConnectionState.Closed);
}
}
แบบที่ 3 ไม่แนะนำ เพราะ การเช็คแบบ รีคอนเนค จะชนกับ การคอนเนคทุก 30 วิ
เว้ากันซื่อๆก็คือ ถึงเราจะไม่รีคอนเนค มันก็ คอนเนคใหม่อยู่แล้ว
ทีนี้ก็เลือกเลยครับ ว่าจะใช้แบบ ที่ 1 2 3 หรือ มีวัตถุประสงค์ อื่นครับ
ปล.ลองทดสอบโค้ดดูก่อน ถ้าไม่ตรงค่อยว่ากันใหม่ล่าย
Date :
2017-12-08 00:40:41
By :
lamaka.tor
ตอบ No.11
ติดตรงนี้ครับ
ตอบ No.10
ผมใช้ timer1 ตั้งเวลาไว้ทุกๆ 45นาที ให้มีการ Sync ข้อมูลไปที่ Server
ทีนี้ติดปัญหาว่า ถ้ามีเน็ตหลุด หรือเชื่อมต่อกับฐาน Server ไม่ได้ มันจะขึ้น MessageBox Error ขึ้นมา
ผมไม่อยากให้มันไม่มี MessageBox Error ขึ้นมา (ตรงนี้ผมไม่ได้ใส่ MessageBox.Show มันก็ขึ้นมานะครับ)
เปลี่ยนเป็น รออีก 30 วิเชื่อมต่อใหม่จนกว่าจะได้ ถ้าเชื่อมต่อได้ค่อยไปทำใน Try ที่ค้างเมื่อกี้ใหม่จนเสร็จกระบวนการ แล้วไปรอ 45 นาทีทำอีกครั้งตามเดิม
Date :
2017-12-08 13:57:57
By :
nPointXer
ทำแบบนี้ได้ไหมครับ
Timer ตั้งเวลาทำงานไว้ที่ 30 วิ
เมื่อเริ่มทำงานให้ยุด Timer ไว้ก่อน
พอทำงานเสร็จ ไม่ว่าจะผ่าน หรือ ไม่ผ่าน ก็ค่อยเปิด Timer มาต่อ
ในกรณีที่ทำงานสำเร็จ ให้บรรทึกเวลาที่ผ่านเอาไว้ (สมมุติว่าเป็นค่า A)
แต่ถ้าไม่สำเร็จก็ไม่ต้องบรรทึกเวลา
Timer ที่ตั้งไว้ทุก 30 วิ
จะตรวจสอบเวลาปัจจุบัน กับ เวลาที่ A ที่ได้บันทึก
ถ้าเวลาห่างกัน 45 นาที
ก็จะเริ่มทำงานอีกครั้ง
ถ้าถึงเวลา 45 นาที ที่ต้องทำงาน
แล้วติดต่อ Server ไม่ได้
ค่าเวลา A จะเป็นเวลาเดิม
Timer ก็จะรออีก 30 วิ
แล้วก็จะทำงานใหม่อีกรอบ
มันจะรอ 30 วิไปเรื่อย ๆ จนทำงานได้
ถึงค่อยทิ้งระยะไปอีก 45 นาที
Date :
2017-12-08 14:40:47
By :
fonfire
ผมอ่านแล้วทุกคอมเม้น ผมกำลังเอาไปประยุกต์ใช้นะครับ ได้ผลยังไงจะมาบอกครับ :)
เบื้องต้นจะใช้ตัวนี้ทดสอบครับ
Code (C#)
do
{
MessageBox.Show("เข้ามาละ");
System.Threading.Thread.Sleep(10000);
} while (conn.State == ConnectionState.Open); //ConnectionState.Closed
ประวัติการแก้ไข 2017-12-08 16:15:53
Date :
2017-12-08 16:14:04
By :
nPointXer
ตอนนี้ใช้แบบนี้ครับ ทดลองแล้วได้ผล ผิดถูกยังไงแนะนำด้วยครับ ไม่รู้ระยะยาวจะเป็นอะไรไหม อาจจะต้องเช็คใน catch ครับว่า ถ้าเกี่ยวกับการติดต่อ Server หรือ Internet หลุด ให้ Sleep 30 วิแล้วลองใหม่ แต่ถ้าเป็น Error อย่างอื่นให้หยุดการทำงานโปรแกรม แล้วฟ้องให้ผู้ใช้ทราบ
Code (C#)
bool tryAgain = true;
while (tryAgain)
{
try
{
using (var conn = new SqlConnection(MyDB))
{
conn.Open();
using (cmd = new SqlCommand("Exec SyncITEM ", conn))
cmd.ExecuteNonQuery();
}
tryAgain = false;
}
catch (Exception)
{
System.Threading.Thread.Sleep(30000);
//ตรงนี้เดี๋ยวจะทำเป็น Timer นับถอยหลังแทน เป็นข้อความแจ้งเตือนประมาณว่า
//ไม่สามารถติดต่อ Server ได้ กำลัง เชื่อมต่อ อีกครั้ง ในอีก ... วินาที
}//end try
}
ประวัติการแก้ไข 2017-12-08 17:14:45 2017-12-08 17:15:12 2017-12-08 17:19:37 2017-12-08 17:32:10
Date :
2017-12-08 17:13:43
By :
nPointXer
ขอบคุณทุกๆคนครับ ได้แนวคิดใหม่เยอะเลย
Date :
2017-12-08 17:35:16
By :
nPointXer
Load balance : Server 04