如何在C#中使用async/await模拟顺序获取用户输入

问题描述 投票:0回答:1

假设您需要从用户输入中获取字符串。在控制台应用程序中,所需的代码很简单:

string input1 = Console.ReadLine();
string input2 = Console.ReadLine();

但是,在我的 Windows 窗体应用程序中,我正在使用多行文本框。我想在用户按下 Enter 键时捕获字符串,每行由换行符分隔。

我很好奇是否有一个异步/等待解决方案可以让我处理 KeyPressed 事件并返回用户输入。理想情况下,我希望实现这样的目标:

string input1 = await GetUserInputAsync();
string input2 = await GetUserInputAsync();
c# async-await
1个回答
0
投票

您可以使用信号量:

    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();
}
© www.soinside.com 2019 - 2024. All rights reserved.