我如何在C#中实现一个只在某些用户事件发生时才返回的方法?

时间:2009-07-02 23:32:02

标签: c# multithreading asynchronous

我得到的是类似OpenFileDialog.Show()方法的东西,它在无限期的时间后返回,只有在用户做某事之后(在这种情况下按Ok)。好吧,我知道我可以通过从对话框,表单或类似的东西中进行子类化来实现对话框控件的类似功能。但是,如果我想做一些与对话完全无关的事情,例如我想编写一个方法InputStringToTextbox(),只有在用户在表单上的文本框中输入合法字符串并按Enter键后才会返回。

我确实对线程和C#的BeginInvoke / EndInvoke的概念有一些基本的了解,但我不太明白如何将这些想法应用于这种特定的情况。

4 个答案:

答案 0 :(得分:4)

如果您需要阻止线程,请参阅ManualResetEventAutoResetEvent类。这些是基本的同步类型,不带有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);
}

答案 1 :(得分:2)

你可以实现一个等待事情发生的方法。

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

}

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

答案 2 :(得分:-1)

您引用的方法有效,因为它调用的.NET API在用户事件发生之前不会返回。你可以做类似的事情。

答案 3 :(得分:-1)

假设WinForms:

如果要确保UI不挂起,则需要确保在等待循环中调用Application.DoEvents()。如果您不这样做,UI将冻结。