假设您需要从用户输入中获取字符串。在控制台应用程序中,所需的代码很简单:
string input1 = Console.ReadLine();
string input2 = Console.ReadLine();
但是,在我的 Windows 窗体应用程序中,我正在使用多行文本框。我想在用户按下 Enter 键时捕获字符串,每行由换行符分隔。
我很好奇是否有一个异步/等待解决方案可以让我处理 KeyPressed 事件并返回用户输入。理想情况下,我希望实现这样的目标:
string input1 = await GetUserInputAsync();
string input2 = await GetUserInputAsync();
您可以使用信号量:
readonly SemaphoreSlim userEnterSemaphore = new SemaphoreSlim(1, 1);
public Form1()
{
InitializeComponent();
}
private async Task DoUserFlow()
{
// do some stuff
// Wait semaphore
await userEnterSemaphore.WaitAsync();
// do some stuff
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13)
{
userEnterSemaphore.Release();
}
}
信号量可能不完全用于此目的,但它可以工作。 您也可以查看 AutoResetEvent,这非常有用。
// Declare the AutoResetEvent (ManualResetEvent exists too)
AutoResetEvent resetEvent = new AutoResetEvent(false);
// Wait for the event
await Task.Run(() => resetEvent.WaitOne());
// Raise the event on key pressed
if (e.KeyChar == (char)13)
{
resetEvent.Set();
}