我试图创建一个应用程序,它通过串口与硬件进行通信并将结果报告给gui。C#GUI刷新和异步串口通信
当前通过GUI进行的移动是由触发GUI的下一个“页面”绘制的KeyEvent完成的。然而,在一个步骤中(按下键后),我需要绘制新页面并通过串口发送少量命令。
命令发送通过完成:
port.Write(data, 0, data.Length);
然后我通过等待DataReceivedHandler触发等待答案 - 它只是针从有数据等待和数据在另一个方法处理。
起初我只是把发送&接收命令放在绘制页面的函数之后的“绘制部分”,但是让它卡住了 - 数据被转移了,但是页面没有绘制 - 它被冻结了。
然后我做了一个异步方法:
private async void SendData()
{
await Task.Run(() => serialClass.SendAndReceive(command));
// process reply etc.
}
这是用这样的:
public void LoadPage()
{
image = Image.FromFile(path);
//do some stuff on image using Graphics, adding texts etc.
picturebox1.Image = image;
SendData();
}
它工作正常,但我需要“刷新”的页面(再次呼叫LoadPage) 。如果我这样做的异步方法里面是这样的:
private async void SendData()
{
await Task.Run(() => serialClass.SendAndReceive(command));
// process reply etc.
LoadPage();
}
那么很明显,图像不会被刷新,但该数据将通过串口发送。是否有可能以某种方式检查异步函数是否完成,并触发一个事件,我可以重新加载页面?
到目前为止,我尝试过使用BackGroundWorker工作完成和属性更改。数据再次发送,但图像未重新加载。任何想法我怎么能实现呢?
在此先感谢您的帮助, 最好的问候
停止使用'async void',[它只能用于事件处理程序](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)。 –