【问题标题】:method waiting for an winform event等待winform事件的方法
【发布时间】:2013-01-20 19:43:38
【问题描述】:

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

停止主线程的方法是:

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

感谢帮助。

【问题讨论】:

标签: c# .net winforms multithreading wait


【解决方案1】:

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

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // do your stuff
    }
}

【讨论】:

  • 我已经这样做了,但没有帮助。我需要停止主线程,但仍然可以调用 textBoxInput_KeyDown()。您的解决方案不会停止线程。
  • @user1461837 你不应该停止主线程。它会挂起你的应用程序
  • 我开始考虑让 Main 成为等待输入的线程,并让每个事件在他自己的线程上运行。
  • @user1461837 你能解释一下你想要达到的目标吗?为什么需要停止线程?请描述您的应用程序的工作流程
【解决方案2】:

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

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

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

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

祝你好运

【讨论】:

  • 通过 KeyDown(),你的意思是文本框 KayDown 事件?
  • 它说任务不存在。
【解决方案3】:

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

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
}

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多