方法,等待winform事件
本文关键字:事件 winform 等待 方法 | 更新日期: 2023-09-27 17:54:34
在我一直在开发的程序中,需要一个方法等待,直到在特定的文本框中单击ENTER(通常,调用winform事件)。我知道我应该这样做与线程,但不知道如何使一个方法,将做到这一点。更具体地说,我不知道如何在线程上调用事件方法,也不能在Main上调用,因为它被阻塞了,直到这个方法被调用。
停止主线程的方法是:
void WaitForInput()
{
while (!gotInput)
{
System.Threading.Thread.Sleep(1);
}
}
只需订阅您的文本框的KeyDown(或KeyPress)事件:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
// do your stuff
}
}
您可以通过使用以下任务将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;
}
好运使用。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
}
目前我被一台装有XP系统的恐龙电脑困住了。NET 2008,直到4月左右才能升级)。我最终遵循了评论中的解决方案,让主线程等待并在线程上运行条目。谢谢!