首页 > 解决方案 > 在阅读或循环期间等待按钮单击

问题描述

我正在创建一个时钟程序。我们的办公室工作人员希望能够在特定员工打卡时向他们发送消息。我遇到的问题是,如果要显示多条消息,它会循环到最后一条。

while(reader.Read()
{
     richtextbox.Text = reader["Message"].ToString();
     //need to pause here and wait for them to press the acknowledge button
{

有没有办法等待或暂停,直到按下确认按钮。

任何帮助表示赞赏。

附言。我试过使用

public static class Utils
{
    public static Task WhenClicked(this Control target)
    {
        var tcs = new TaskCompletionSource<object>();
        EventHandler onClick = null;
        onClick = (sender, e) =>
        {
            target.Click -= onClick;
            tcs.TrySetResult(null);
        };
        target.Click += onClick;
        return tcs.Task;
    }
}

从这个线程等到点击事件被触发 C#但它做了同样的事情并吹过按钮并再次显示最后一条消息。

标签: c#loopsfor-loopwhile-loop

解决方案


我会这样处理这个问题。让您的阅读器将所有消息加载到像队列这样的集合中(这是一个先进先出的集合,非常适合您尝试做的事情。)在循环之后,如果有任何消息,则显示第一个一。将单击事件连接到类似的代码块,每次单击按钮时都会显示下一条消息(如果存在的话)。代码如下所示:

Queue<string> EmployeeMessages = new Queue<string>();
private void OnLogin()
{
    var reader = GetReader();

    while (reader.Read())
    {
        EmployeeMessages.Enqueue(reader["Message"].ToString());
    }

    if (EmployeeMessages.Count > 0)
    {
        label1.Text = EmployeeMessages.Dequeue();
    }
}


private void button1_Click(object sender, EventArgs e)
{
    if (EmployeeMessages.Count > 0)
    {
        label1.Text = EmployeeMessages.Dequeue();
    }
}

推荐阅读