Visual Studio: Можно ли использовать событие AutoReset для ожидания потока в непотоковом методе (например, внутри Button1)? - PullRequest
0 голосов
/ 25 февраля 2020

Я использовал MyThreadDone.WaitOne внутри al oop в непотоковом методе (который вызывает и запускает потоки, каждый из которых имеет MyThreadDone.Set в конце метода потока), а WaitOne, похоже, не распознается в непотоковом методе?

Код будет выглядеть так:

'Set the global AutoReset Event
Public MyThreadDone As New AutoResetEvent(False)

'Initially set the thread waiting to .Set in e.g. Form1_Load
    MyThreadDone.Set

'Somewhere in e.g. Button1
For i As Integer = 1 To 5
    Dim classwiththread as New ClassWithThreadedMethod()
    MyThreadDone.WaitOne
Next

Public Class ClassWithThreadedMethod
  Sub New()
     Dim t As New Thread(AddressOf MyMethod)
     t.Start()
  End Sub

  Sub MyMethod()
     .
     'Do the work
     .
     MyThreadDone.Set
  End Sub
End Class

1 Ответ

0 голосов
/ 25 февраля 2020

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

AutoResetEvent нельзя использовать в непоточных методах, например, в среде Button1. Когда WaitOne был запущен внутри Button1, все останавливалось, включая выполнение программы внутри Button1, а также все потоки, которые уже были запущены. Другими словами, ничего не будет работать (пользовательский интерфейс или потоки, которые уже были запущены).

Следовательно, WaitOne и Set могут использоваться только внутри потоковых методов, то есть методов, которые являются частью потока, они не могут использовать везде, где вы хотите, особенно непотоковые методы или код, для которого, как вы думаете, вы можете дождаться завершения потоков, прежде чем начнется следующий поток.

...