Как я могу реализовать в C # метод, который возвращает только тогда, когда происходит какое-то пользовательское событие?

2

то, что я получаю, - это что-то вроде метода OpenFileDialog.Show(), который возвращается после неопределенного количества времени, только после того, как пользователь что-то делает (в этом случае нажимает Ok). Ну, я знаю, что я могу добиться аналогичных действий для управления диалоговыми окнами путем подкласса из диалога, формы или чего-то подобного. Но что, если я хочу сделать это для чего-то совершенно не связанного с диалоговыми окнами? Я хочу написать метод InputStringToTextbox(), который будет возвращаться только после того, как пользователь ввел юридическую строку в текстовое поле в форме и нажал Enter.

У меня есть некоторое базовое воздействие на концепции потоков и С# BeginInvoke/EndInvoke, но я не совсем понимаю, как применять эти идеи в этой конкретной ситуации.

  • 2
    Вы действительно нуждаетесь в блокирующем поведении или вы можете согласиться на получение уведомления, когда то, что вы ожидаете, завершается?
Теги:
multithreading
asynchronous

4 ответа

4

Если вам нужно блокировать потоки, обратитесь к 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);
}
2

Вы можете просто реализовать метод, который ждет чего-то.

void MainMethod()
{
...
...
DoSomethingAndWait()
...

}

private void DoSomethingAndWait()
{
...
...
   while(!somethingHappened) //updated by other thread
   {
        Thread.Sleep(100) ;
   }
...
}
-1

Используемый вами метод работает, потому что он вызывает .NET API, который не возвращается до тех пор, пока не произойдет событие пользователя. Вы можете сделать что-то подобное.

  • 0
    Downvoter? Скажите мне, что не так с этим ответом, и я смогу это исправить.
-1

Предполагая, что WinForms:

Если вы хотите убедиться в том, что пользовательский интерфейс не зависает, вам нужно обязательно вызвать Application.DoEvents() в цикле ожидания. Если вы этого не сделаете, пользовательский интерфейс замерзнет.

  • 1
    Есть лучшие способы сделать это. Application.DoEvents () может привести к трудным для отладки проблемам повторного входа.
  • 0
    Вызов DoEvents () опасен, поэтому, если вы используете его, вы должны делать это с осторожностью.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню