Остановка потокового приложения в C # Windows Application? - PullRequest
3 голосов
/ 07 ноября 2011

Я делаю приложение для Windows в C #, в котором при нажатии кнопки я написал код как

public void btnStart_Click(object sender, EventArgs e)
        {
              while(true)
               {
                    //some processing
               }
        }

когда я запускаю приложение, оно работает непрерывно. Но на другой кнопке я хочу остановить это приложение. Но я не понимаю, как это сделать? Пожалуйста, помогите мне.

Ответы [ 6 ]

1 голос
/ 07 ноября 2011

Взгляните на Background Worker очень легко сделать нити:)

1 голос
/ 07 ноября 2011

Вы можете сделать пользователя таймера C #, вот один из примеров секундомера с использованием таймера: Создание простого приложения секундомер / таймер с C # / Windows Forms

, вот один пример:Проверьте полный ответ и код по адресу: Кнопка запуска / остановки C # * Пример 1006 *

с использованием BackGroundWorker (его немного измененная версия фрагмента кода AmaL):

BackgroundWorker bgw;
Stopwatch watch;

public Form1()
{
  InitializeComponent();
  label1.Text = "";
  watch = new Stopwatch();
  bgw = new BackgroundWorker();
  bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
  bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
  bgw.WorkerReportsProgress = true;
  bgw.WorkerSupportsCancellation = true;
}

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
  while (true)
  {
    bgw.ReportProgress(0);
    System.Threading.Thread.Sleep(100);

    if (!watch.IsRunning)
      break;
  }
}

private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  TimeSpan ts = watch.Elapsed;
  label1.Text = String.Format("{0:00}:{1:00}:{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds);
}

private void button1_Click(object sender, EventArgs e)
{
  watch.Start();
  bgw.RunWorkerAsync();
}

private void button2_Click(object sender, EventArgs e)
{
  watch.Stop();
  watch.Reset();
  bgw.CancelAsync();      
}
0 голосов
/ 07 ноября 2011

Вы блокируете свой основной поток, когда делаете это в то время как (true).

Вместо этого запускайте тяжелую работу в другом потоке.

Вы можете найти учебное пособие по потокам здесь: http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

0 голосов
/ 07 ноября 2011

Если вы хотите создать отзывчивый пользовательский интерфейс, вы никогда не должны писать код, подобный while (true) {...}, потому что таким образом вы загружаете основной поток.Здесь вы действительно должны использовать BackgroundWorker .Не забудьте установить его WorkerSupportsCancellation , прежде чем запускать рабочий поток с помощью RunWorkerAsync () . Есть хороший практический совет.

0 голосов
/ 07 ноября 2011
0 голосов
/ 07 ноября 2011

Вы должны выполнять тяжелую работу в другом потоке, отличном от потока пользовательского интерфейса.

...