0

私が開発しているプログラムでは、特定のテキストボックス内でENTERがクリックされるまで待機するメソッドが必要です(通常、winformイベントが呼び出されます)。スレッドでこれを行う必要があることは知っていますが、それを行うメソッドを作成する方法がわかりません。より具体的には、スレッドでイベント メソッドを呼び出す方法がわからず、このメソッドが呼び出されるまでブロックされているため、メインで呼び出すことができません。

メインスレッドを停止する方法は次のとおりです。

 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 で、4 月かそこらまでアップグレードできません) を使用しています。私はコメントから解決策をたどり、メインスレッドを待機させ、スレッドでエントリを実行しました。ありがとう!

于 2013-01-21T21:13:00.883 に答える