Thread.Sleep时按钮无法单击

时间:2015-07-28 07:40:06

标签: c# delay

据我所知,当执行Thread.Sleep时,我的GUI上的按钮无法点击。

有没有其他方法可以延迟我的代码流动但仍然能够点击GUI上的按钮?

例如,在我的代码执行Thread.Sleep(10000)之后立即执行;在这10秒钟内我无法点击我的button1事件,无论如何我还能在这10秒钟内点击我的button1事件吗?

        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 = "";  
        }
    }

提前致谢。

4 个答案:

答案 0 :(得分:4)

有多种方法可以实现这一目标。一个例子是使用延迟的任务:

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

另一个例子可能是使用为此目的而制作的BackgroundWorker

答案 1 :(得分:2)

from datetime import datetime, timedelta
from django.contrib import auth


class AutoLogout:
  def process_request(self, request):
    if not request.user.is_authenticated() :
      #Can't log out if not logged in
      return

    try:
      if datetime.now() - request.session['last_touch'] > timedelta( 0, settings.AUTO_LOGOUT_DELAY * 60, 0):
        auth.logout(request)
        del request.session['last_touch']
        return
    except KeyError:
      pass

    request.session['last_touch'] = datetime.now()

查看Task.DelayContinueWith

答案 2 :(得分:2)

您可以使用 Async和Await

这是一个结合GUI的好教程: https://www.youtube.com/watch?v=MCW_eJA2FeY

您需要将您的功能声明为async

public async void Foo()
{
    ...
}

比你可以使用:

await Task.Delay(10000);

它将为您发布整个Delay的GUI,您可以在Delay等待时使用您的GUI。

答案 3 :(得分:0)

您可以使用Windows.Forms.Timer在延迟后执行某些操作...(没有UI线程冻结)。将代码拆分为两部分。 1.延迟之前2.延迟之后

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;
   }
}

使用Timer的好处是它是一个本机的Windows窗体工具,专门用于帮助解决这类问题。 但是,您仍然可以使用Tasks之类的现代内容,例如:Task.Factory.StartNew(() => { Thread.Sleep(5000); // your method logic here });