我正在编写一个程序,通过串口从设备读取信息。我有一个数据网格中可用设备的列表。当用户单击某一行时,它会从设备中提取信息并将其显示在单独的列表中。设备响应和填充信息通常需要大约一秒钟。但是,在此秒期间,数据网格行不会突出显示为已选中。因此,从鼠标点击数据网格行开始,它实际显示为突出显示/已选择时需要大约一秒钟。
我认为后台工作线程最适合用于此,但我使用下面的代码得到了相同的结果。我是否错误地使用它,或者我还应该做些什么来选择数据网格行?
private void relayList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += GetLinks;
worker.RunWorkerAsync();
}
private void GetLinks(object sender, DoWorkEventArgs e)
{
//send message to viewModel and do time-consuming work here
}
答案 0 :(得分:0)
BackgroundWorker具有RunWorkerCompleted方法。它将在UI线程的执行上下文中运行。
还有一个result属性用于将结果传递给下一个方法,即RunWorkerCompleted方法。
private void yourMethod()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWorkMethod;
worker.RunWorkerCompleted += RunWorkerCompletedMethod;
worker.RunWorkerAsync();
}
private void RunWorkerCompletedMethod(object sender, RunWorkerCompletedEventArgs e)
{
string result = (string)e.Result;
// do stuff here
}
private void DoWorkMethod(object sender, DoWorkEventArgs e)
{
e.Result = string.Empty; // Your device data
}
如果你绝望地想要不使用已完成的方法。不要使用调度程序,而是使用SynchronizationContext。
首次运行表单时,您需要在字段上存储SynchronizationContext.Current,但之后您可以在UI线程上调用所需的任何内容。