【发布时间】:2016-11-15 16:41:37
【问题描述】:
我在上一个问题中问过如何"Threading 2 forms to use simultaneously C#"。
我现在意识到我不够明确并且问错了问题。
这是我的场景:
我有一些从本地服务器接收的数据,需要写入文件。
此数据以我无法控制的恒定时间速率发送。
我想做的是为tcp流的初始设置设置一个winform,然后单击一个按钮开始读取tcp流并将其写入文件,同时启动另一个带有多个检查的winform-我需要检查选中状态并将该信息同时添加到同一文件中的框。
此处理将在按下不同按钮时停止,关闭流、文件和第二个 winform。 (此按钮位置对于任何 winform 都不是特别强制的)。
由于这个取消按钮(在我尝试实现第二种形式之前),我使用后台工作程序能够异步取消用于读取流和写入文件的 do while 循环。
private void bRecord_Click(object sender, EventArgs e)
{
System.IO.StreamWriter file = new System.IO.StreamWriter(AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss") + ".xml", true);
data_feed = client.GetStream();
data_write = new StreamWriter(data_feed);
data_write.Write("<SEND_DATA/>\r\n");
data_write.Flush();
exit_state = false;
string behavior = null;
//code to launch form2 with the checkboxes
//...
worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler((state, args) =>
{
do
{
int var = data_feed.ReadByte();
if (var != -1)
{
data_in += (char)var;
if (data_in.IndexOf("\r\n") != -1)
{
//code to check the checkboxes state in form2
//if (form2.checkBox1.Checked) behavior = form2.checkBox1.Text;
//if (form2.checkBoxn.Checked) behavior = form2.checkBoxn.Text;
file.WriteLine(data_in + behavior);
data_in = "";
}
}
}
while (exit_state == false);
});
worker.RunWorkerAsync();
}
private void bStop_Click(object sender, EventArgs e)
{
exit_state = true;
worker.CancelAsync();
}
我希望我现在更清楚了。 我没有事件编程经验,刚开始使用 C#,所以如果可能,请尝试在答案中提供一些简单的示例。
【问题讨论】: