等待用户输入以在c#winforms中继续StreamReader

时间:2015-12-29 01:39:08

标签: c# winforms user-input streamreader

我正在创建一个应用程序,用于将csv中的行分类为四个类别之一。应用程序读取csv,显示一行,并在读取下一行之前按下一个按钮(每个类别一个),等待用户选择该行所属的类别。

我尝试的是:

 using (StreamReader reader = new StreamReader(inputFile))
 {
       reader.ReadLine();      // skip first line
       string line;
       while ((line = reader.ReadLine()) != null)
       {
           // Display line
           proceed = false;
           while (!proceed) { }        // wait for user input
       }
 }

在类别选择按钮上按“继续”按钮将改为真。问题是这只是锁定整个程序,你不能按任何按钮。

如何实现相同的功能?

1 个答案:

答案 0 :(得分:1)

正如你所说,while (!proceed)循环阻止了你的程序。一种可能的解决方案是使用另一个线程来处理CSV文件,以便用户界面保持响应。首先,创建一个AutoResetEvent属性,该属性将用于与用户提供输入的新线程进行通信,是时候继续执行其操作了:

AutoResetEvent waitInput = new AutoResetEvent(false);

现在创建一个处理CSV文件的新方法,该方法将在一个单独的线程上运行:

private void ReadAllLines()
{
    using (StreamReader reader = new StreamReader(inputFile))
    {
        reader.ReadLine(); // skip first line
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            waitInput.WaitOne(); // wait for user input

            // Do your stuff...
        }
    }
}

此时,当您想开始处理CSV文件时,请创建一个新线程并启动它:

// The new thread will run the method defined before.
Thread CSVProcessingThread = new Thread(ReadAllLines);
CSVProcessingThread.Start();

要使程序正常工作,还有最后一个操作:我们必须在用户输入时告诉新线程,否则新线程将继续等待用户输入而不做任何事情(但是你的主要线程将继续正常工作)。如果要传达新线程必须继续执行其工作,请将此行插入代码:

waitInput.Set();

在您的场景中,您应该在按钮单击事件处理程序中插入此行,以便当用户单击按钮继续处理CSV文件时,新创建的线程将继续处理{{1中定义的文件例行公事。