2012-04-04 6 views
0
public partial class MainWindow : window 
{ 
    private Thread t = new Thread; 

    private void btnSend_Click(object sender, RoutedEventArgs e) 
    { 
     if (t != null) 
     { 
      if (t.IsAlive == true) 
      { 
       t.Abort(); 
       t = null; //Is this correct? should I free this before making null? 
       return; 
      } 

      t = new Thread(send.Image); 
      t.Start();  
     } 
    } 
} 

В приведенном выше коде показан обработчик событий. Когда я нажимаю кнопку «Отправить», новый процесс должен быть создан. и когда я нажимаю ту же кнопку, процесс должен останавливаться. Затем снова нажмите «Отправить», и процесс должен начать снова. Поток должен быть создан в одном и том же объекте 't'.должен освободить объект нити? C#

+2

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

+0

Подумайте об использовании более абстрактного способа использования нити, по крайней мере, для threadpool или более лучшего TPL. –

ответ

1

Преимущество устранения ссылки на Thread заключается в том, что вы позволяете GC собирать любые данные, которые имеет класс Thread, но вы постоянно используете stop the thread, когда вы вызываете Abort. Поскольку класс потоков не реализует IDisposable, нет способа детерминистически освободить неуправляемые ресурсы, принадлежащие классу, мы надеемся, что Abort сделает это.

Класс Thread имеет довольно небольшой вес и, если у вас много работающих в MainWindows, оно, вероятно, не повлияет на потребление вашей памяти. Однако хорошей практикой является удаление ссылок на ваши объекты, если вы знаете, что никогда не будете использовать их снова.

1

Это не технически хорошо, чтобы сделать это, но вы должны сделать это таким образом:

private Thread t; // initially null 
private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    if (t != null) 
    { 
     t.Abort(); 
     t = null; 
    } 
    else 
    { 
     t = new Thread(send.Image); 
     t.Start();  
    } 
} 

Кроме того, он, возможно, не хороший дизайн позвонить Abort.

Вместо этого вы можете реализовать свой метод потока таким образом, чтобы он циклически проверял WaitHandle. Это позволяет прерывать резьбу контролируемым образом:

private Thread t; // initially null 
private AutoResetEvent waitHandle = new AutoResetEvent(false); 

private void btnSend_Click(object sender, RoutedEventArgs e) 
{ 
    if (t != null) 
    { 
     waitHandle.Set(); // signal thread termination 
     t = null; 
    } 
    else 
    { 
     t = new Thread(ThreadMethod); 
     t.Start();  
    } 
} 

private void ThreadMethod() 
{ 
    TimeSpan waitTime = TimeSpan.FromSeconds(1); 
    while (!waitHandle.WaitOne(waitTime)) 
    { 
     // do something 
    } 
} 
+0

об использовании waitHandle, проблема есть, поток метод 'send.Image' занимает слишком много времени. около 9 часов. Я начинаю поток, нажимая кнопку «Отправить» в окне пользовательского интерфейса. Эти много часов, мой интерфейс должен оставаться отзывчивым. и я согласен с «if-else». Он должен быть оптимизирован. – SHRI

Смежные вопросы