Button Cannot Click When Thread.Sleep

I understand that when running Thread.Sleep, the buttons on my GUI cannot be pressed.

Are there any other ways to delay the transfer of my codes, but you can still click on my buttons in the graphical interface?

For example, right now, after my codes execute Thread.Sleep (10000); and during these 10 seconds I cannot click on the button1 event, is there anyway that I can still click on the button1 event in these 10 seconds?

private void displaydata_event2(object sender, EventArgs e) { txt_data.AppendText(in_data + "\n"); string inStr; inStr = in_data; //MessageBox.Show(inStr.Length.ToString()); if (inStr.Length == 12) { int indexOfSpace = inStr.IndexOf(' '); string Patient = inStr.Substring(indexOfSpace + 1); int rx = 0; int selected = 0; txtData1.Text = Patient; rx = Convert.ToInt16(Patient); selected = Convert.ToInt16(txt_pnorec.Text); if (rx != selected) { MessageBox.Show("Please check patient settings"); } } else if (inStr.Length == 24) { label2.Text = "Patient is not selected!"; label2.BackColor = Color.Red; } else if (inStr.Length == 10) { int indexOfSpace = inStr.IndexOf(':'); string Temp = inStr.Substring(indexOfSpace + 1); txtData2.Text = Temp; double tempflo; tempflo = Convert.ToDouble(Temp); if (tempflo > 20) { lbl_temp.Text = "Fever"; lbl_temp.BackColor = Color.Red; } } else if (inStr.Length == 9) { int indexOfSpace = inStr.IndexOf(':'); string ECG = inStr.Substring(indexOfSpace + 1); txtData3.Text = ECG; } else if (inStr.Length == 19 || inStr.Length == 20) { int indexOfSpace = inStr.IndexOf(':'); string Systolic = inStr.Substring(indexOfSpace + 1); txtData4.Text = Systolic; } else if (inStr.Length == 21 || inStr.Length == 22) { int indexOfSpace = inStr.IndexOf(':'); string Diastolic = inStr.Substring(indexOfSpace + 1); txtData5.Text = Diastolic; } else if (inStr.Length == 16) { int indexOfSpace = inStr.IndexOf(':'); string Pulse = inStr.Substring(indexOfSpace + 1); txtData6.Text = Pulse; } else if (inStr.Length == 23 || inStr.Length == 17 || inStr.Length == 27 || inStr.Length == 30 || inStr.Length == 35 || inStr.Length == 29) { lbl_bp.Text = inStr;//to display status of BP (Normal,prehypotension etc) string bp; bp = inStr; if (bp.Length == 23 || bp.Length == 27 || bp.Length == 31 || bp.Length == 35 || bp.Length == 30) { lbl_bp.BackColor = Color.Red; } else if (bp.Length == 17) { lbl_bp.BackColor = Color.LightGray; } } else if (inStr.Length == 32 || inStr.Length == 25 || inStr.Length == 34 || inStr.Length == 33 || inStr.Length == 26 || inStr.Length == 31) { int indexOfSpace = inStr.IndexOf(':'); string Acc = inStr.Substring(indexOfSpace + 1); txtData7.Text = Acc; string test = inStr; if (test.Length == 25 || test.Length == 34 || test.Length == 33 || test.Length == 26) { label21.Text = "Check on patient!"; label21.BackColor = Color.Red; } else if (test.Length == 32) { label21.Text = ""; label21.BackColor = Color.LightGray; } } else { } if (txtData1.Text != "" && txtData2.Text != "" && txtData3.Text != "" && txtData4.Text != "" && txtData5.Text != "" && txtData6.Text != "" && txtData7.Text != "") { try { connection2.Open(); OleDbCommand command2 = new OleDbCommand(); command2.Connection = connection2; command2.CommandText = "insert into MedicalRecord (PatientNumber,FirstName,LastName,IC,Temperature,ECG,Systolic,Diastolic,Pulse) values('" + txt_pnorec.Text + "','" + txt_fnamerec.Text + "','" + txt_lnamerec.Text + "','" + txt_icrec.Text + "','" + txtData2.Text + "','" + txtData3.Text + "','" + txtData4.Text + "','" + txtData5.Text + "','" + txtData6.Text + "')"; command2.ExecuteNonQuery(); MessageBox.Show("Info Stored"); connection2.Close(); txtData1.Text = ""; txtData2.Text = ""; txtData3.Text = ""; txtData4.Text = ""; txtData5.Text = ""; txtData6.Text = ""; txtData7.Text = ""; Thread.Sleep(interval); MessageBox.Show("Start"); } catch (Exception ex) { MessageBox.Show("Error: " + ex); } txtData1.Text = ""; txtData2.Text = ""; txtData3.Text = ""; txtData4.Text = ""; txtData5.Text = ""; txtData6.Text = ""; txtData7.Text = ""; } } 

Thanks in advance.

+5
source share
4 answers

There are several ways to achieve this. One example is the use of a delayed task:

 Task.Delay(10000).ContinueWith(x => { //Place the code you want delayed here. }); 

Another example would be the use of BackgroundWorker , which is made for this particular purpose.

+4
source
 Task.Delay(10000).ContinueWith(x => { //... }); 

See Task.Delay and Continue with .

+2
source

you can use async and await

here is a good tutorial combined with a GUI: https://www.youtube.com/watch?v=MCW_eJA2FeY

you need to declare your function as async

 public async void Foo() { ... } 

than you can use:

 await Task.Delay(10000); 

he will release your GUI for all of Delay , and you can use his GUI while Delay is waiting.

+2
source

You can use Windows.Forms.Timer to do something after a delay ... (without hanging the user interface thread). Divide your code into two parts. 1. Before the delay 2. After the delay

 public partial class form1 : Form { // i used namespace to ensure that we use 'correct' Timer and we do not // confuse it with System.Timers.Timer or System.Threading.Timer System.Windows.Forms.Timer tmrDelay; void SomeMethodWithDelay() { // code before delay here tmrDelay.Enabled = true; tmrDelay.Tick += Timer_Tick; } private void Timer_Tick(object sender, EventArgs e) { Thread.Sleep(5000); // your code here // disables timer to stop it tmrDelay.Enabled = false; } } 

The advantage of using a timer is that it is a means of creating your own windows, which is specifically designed to solve such problems. However, you can use modern things, such as Tasks , for example: Task.Factory.StartNew(() => { Thread.Sleep(5000); // your method logic here });

0
source

All Articles