то, что я получаю, - это что-то вроде метода OpenFileDialog.Show(), который возвращается после неопределенного количества времени, только после того, как пользователь что-то делает (в этом случае нажимает Ok). Ну, я знаю, что я могу добиться аналогичных действий для управления диалоговыми окнами путем подкласса из диалога, формы или чего-то подобного. Но что, если я хочу сделать это для чего-то совершенно не связанного с диалоговыми окнами? Я хочу написать метод InputStringToTextbox(), который будет возвращаться только после того, как пользователь ввел юридическую строку в текстовое поле в форме и нажал Enter.
У меня есть некоторое базовое воздействие на концепции потоков и С# BeginInvoke/EndInvoke, но я не совсем понимаю, как применять эти идеи в этой конкретной ситуации.
Если вам нужно блокировать потоки, обратитесь к ManualResetEvent и AutoResetEvent. Это основные типы синхронизации, которые не поставляются с дополнительным багажом таких типов, как Monitor, и на самом деле многие из .NET на их основе строятся типы синхронизации.
Вот краткий пример, демонстрирующий использование для контекста, который вы предоставили.
static class ThreadEntryPoints
{
public static Main()
{
ShowDialog();
}
public static Other_Main()
{
// ... do some work ...
_event.Set();
}
private static ShowDialog()
{
// ... do some work ...
_event.WaitOne(/* optionally set timeout */);
}
private static readonly ManualResetEvent _event = new ManualResetEvent(false);
}
Вы можете просто реализовать метод, который ждет чего-то.
void MainMethod()
{
...
...
DoSomethingAndWait()
...
}
private void DoSomethingAndWait()
{
...
...
while(!somethingHappened) //updated by other thread
{
Thread.Sleep(100) ;
}
...
}
Используемый вами метод работает, потому что он вызывает .NET API, который не возвращается до тех пор, пока не произойдет событие пользователя. Вы можете сделать что-то подобное.
Предполагая, что WinForms:
Если вы хотите убедиться в том, что пользовательский интерфейс не зависает, вам нужно обязательно вызвать Application.DoEvents() в цикле ожидания. Если вы этого не сделаете, пользовательский интерфейс замерзнет.