我一直在研究WinForms实用程序,该实用程序从文本文件获取命令和/或数据,并基于此文件的内容通过串行传输或请求更多数据。这一切都很完美,但我正在努力研究如何让GUI给出一些反馈,指出发生了什么。在其目前的结构形式主要负载和Load()
事件打开文本文件,并处理其内容线程和更新GUI
tp = new TProcess();
tp.FileOpen();
T加工和所有参与串口通信的其它类被收集到一个子项目,编译如下一个DLL。反过来,TProcess将创建SerialDevice对象的新实例(也在我的DLL中定义),并将其传递给我的数据,然后告诉它如何处理它,例如
//TProcess
if (File.Exists(filey))
try
{
StreamReader file = new StreamReader(@"filey");
List<clsStuff> stuffList = new List<clsStuff>();
while ((line = file.ReadLine()) != null)
{
//process and add to list
}
var SD = new SerialDevice();
SD.List = stuffList;
SD.Send();
file.Close();
}
catch (Exception e)
{
//Write Error File
}
}
我的SD类定义了所有的端口参数,将第一项的数据包,并接收确认来自使用DataReceived事件检索远程设备分组时,它然后在一时间发送从所述列表中的一个项目,直到它有完成并退出。 因此,我的问题(对不起长时间啰嗦)是我怎么能通过某种反馈(可能是每次我收到一个数据包确认后收到Record X的字符串)事情发生在GUI上,因为GUI线程没有创建我的SD实例,如果这是一个更紧凑的程序,并且GUI线程已经调用SD,我将使用委托和BeginInvoke,但是我不明白我在这里如何做到这一点,因为GUI对SD实例一无所知,同样,SD也不知道关于GUI。我觉得这可能通过SynchronisationContext解决,但我不知道如何实现它。
public void Send()
{
if (!serialP.IsOpen)
{
PortOpen();
serialP.ReceivedBytesThreshold = 4;
}
serialP.Write(CurrentListItem, 0, 11);
}
private void serialP_DataEvent(object sender, SerialDataReceivedEventArgs e)// This triggers when the response is received
{
byte[] Ack = new byte[4];
serialP.Read(Ack, 0, 4);
//snip of course I check these 4 bytes etc here
CurrentListItem++;
//UPDATE THE GUI BUT HOW?
Send()!;//next
}
* //更新GUI,但是如何使用您的视图也可以订阅的事件。但是它看起来像你对文件的处理是阻塞的(很难用你的代码片段来说明),所以你可能也想做出这种异步。 –
请编辑您的问题并设置您的代码的格式,以便可读 –
@sowjanyaattaluri:存在事件,因此您不必这样做。 –