2013-07-31 2 views
1

Я узнал, что Thread.Suspend не является хорошим способом приостановить поток на неопределенный срок. Пожалуйста, дайте мне знать, если вы добьетесь чего-то другого.Есть ли способ приостановить поток на неопределенный срок в VB.Net

Заранее благодарен.

+0

См. Это «System.Threading.EventWaitHandle» http://stackoverflow.com/questions/4848064/c-sharp-how-to-pause-the-thread-and-continue-when-some-event-occur – user1477388

+1

Нет смысла приостанавливать поток навсегда. Почему бы не просто «прервать» его? По крайней мере, тогда он больше не будет использовать системные ресурсы. (Или используйте «ThreadPool» для коротких рабочих элементов, и вам не придется думать о приостановке или очистке рабочих потоков.) – stakx

+0

Есть несколько действительно хороших объяснений на http://stackoverflow.com/questions/142826/is -there-a-way-to-indefinitely-pause-a-thread – Prash

ответ

1

Короткий В.Б пример

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
    thrd.IsBackground = True 
    thrd.Start() 
End Sub 

Dim thrd As New Threading.Thread(AddressOf somethread) 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    'pause and resume 
    'first click pauses, second click resumes 
    reqpause.Set() 'set event 
End Sub 

Dim reqpause As New Threading.AutoResetEvent(False) 

Private Sub somethread() 
    Do 
     'simulate work - your code here 
     Threading.Thread.Sleep(500) 
     Debug.WriteLine(DateTime.Now.ToLongTimeString) 
     'end simulate work 

     If reqpause.WaitOne(0) Then 'pause requested? 
      Debug.WriteLine("t-thrd paused") 
      reqpause.WaitOne() 'wait here for continuation 
      Debug.WriteLine("t-continue thrd") 
     End If 
    Loop 
End Sub 
0

Использование Suspend и Resume - это не очень хорошая идея. Я не уверен, почему вы хотите ждать вечно, но ждать, чтобы ждать EventWaitHandle.

private EventWaitHandle handle = new AutoResetEvent(); 

private void WorkerThread() 
{ 
    while(true) 
    { 
     handle.WaitOne(); 
    } 
} 
//Forever is a long time 
public void StopWaitingForever() 
{ 
    handle.Set(); 
} 
0

Другой простой способ заключается в вызове Sleep(Timeout.Infinite).

Ссылка here.

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