我正在创建一个应用程序,用于将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
}
}
在类别选择按钮上按“继续”按钮将改为真。问题是这只是锁定整个程序,你不能按任何按钮。
如何实现相同的功能?
答案 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中定义的文件例行公事。