0

在我一直在开发的程序中,需要一种方法来等到在特定文本框内单击 ENTER (通常是调用 winform 事件)。我知道我应该用线程来做这件事,但不知道如何制作一个可以做到这一点的方法。更具体地说,我不知道如何在线程上调用事件方法,也无法在 Main 上调用,因为在调用此方法之前它会被阻塞。

停止主线程的方法是:

 void WaitForInput()
 {
     while (!gotInput)
     {
         System.Threading.Thread.Sleep(1);
     }
 }

感谢帮助。

4

4 回答 4

1

只需订阅文本框的KeyDown(或KeyPress)事件:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // do your stuff
    }
}
于 2013-01-20T19:46:57.600 回答
0

您可以首先使用以下任务将 WaitForInput 方法更改为线程化:

  private void WaitForInput()
  {
      Task.Factory.StartNew(() =>
          {
              while (!gotInput)
              {
                  System.Threading.Thread.Sleep(1);
              }
              MessageBox.Show("Test");
          });
  }

然后捕获文本框的 KeyPressed 事件并将布尔值 gotInput 的状态更改为 true,如下所示:

  private void KeyDown(object sender, KeyPressEventArgs e)
  {
      if (e.KeyChar == (char)13)
          gotInput = true;
  }

祝你好运

于 2013-01-20T19:59:28.213 回答
0

使用async/await.NET 4.5 中的关键字。你可以这样做:

CancellationTokenSource tokenSource; // member variable in your Form

// Initialize and wait for input on Form.Load.
async void Form_Load(object sender, EventArgs e)
{
  tokenSource = new CancellationTokenSource();
  await WaitForInput(tokenSource.Token);

  // ENTER was pressed!
}

// Our TextBox has input, cancel the wait if ENTER was pressed.
void TextBox_KeyDown(object sender, KeyEventArgs e)
{
  // Wait for ENTER to be pressed.
  if(e.KeyCode != Keys.Enter) return;

  if(tokenSource != null)
    tokenSource.Cancel();
}

// This method will wait for input asynchronously.
static async Task WaitForInput(CancellationToken token)
{
  await Task.Delay(-1, token); // wait indefinitely
}
于 2013-01-20T20:28:43.680 回答
0

目前我被一台装有 XP 的恐龙电脑困住了(.NET 2008,直到四月左右才能升级)。我最终遵循了评论中的解决方案,并让主线程等待并在线程上运行条目。谢谢!

于 2013-01-21T21:13:00.883 回答