问题描述
|
我正在创建一个快速的\'n \'脏工具,该工具可以编辑从一组文件顺序读取的数据。这是一个循环的简单迭代中发生的非常简单的解释:
从输入流中读取一行
解析它并使用解析结果填充表单控件
允许用户编辑并等待确认按钮单击
检索更新的表单控制值并写入输出流
我不知道是如何将处理循环与事件驱动的UI集成在一起的。例如,如何在等待用户输入时暂停循环操作。
我知道可以通过在自己的线程上启动循环操作并编写代码来管理其与UI线程的交互来实现这一点,但是我想知道是否有一种更简单的方法可以立即使用。
感谢您提出的任何想法。
提姆
解决方法
我可以想到两种方法来做到这一点:
最简单的方法可能是使用模式对话框:当工作线程需要用户输入时,显示一个对话框,这是一个阻塞操作。像这样:
// Worker thread loop
while(...)
{
...
// prompt user for data (invoke synchronously on UI thread)
UserData data = (UserData)window.Invoke(PromptUserData);
...
}
...
UserData PromptUserData()
{
UserInputDialog dlg = new UserInputDialog();
dlg.ShowDialog();
return dlg.UserData;
}
如果您不想使用模式对话框,则另一个选择是使用等待句柄来同步工作线程和UI:
私有只读AutoResetWaitHandle _userInputWaitHandle = new AutoResetWaitHandle(false);
...
// Worker thread loop
while(...)
{
...
// Setup the UI to allow user input
window.Invoke(SetupUIForInput);
// Wait for the input to be validated
_userInputWaitHandle.WaitOne();
...
}
...
void SetupUIForInput()
{
// Enable the UI
inputForm.Enabled = true;
// Whatever else you need to do...
...
}
void buttonOK_Click(object sender,EventArgs e)
{
// Signal the worker thread to continue
_userInputWaitHandle.Set();
}
, 从狭义上讲,您不会真正实现循环。
您将执行以下操作(伪代码):
OnStartOperationButtonClick()
{
if(!ReadLine())
return;
ParseLineAndPopulateControls();
ShowEditingControls();
}
OnConfirmationButtonClick()
{
GetControlValuesAndWriteToOutputStream();
if(!ReadLine())
{
HideEditingControls();
return;
}
ParseLineAndPopulateControls();
}
鉴于读取和解析该行不会花费很长时间,因此不需要单独的线程。