C# - 如何从后台工作线程访问窗体控件中的信息
本文关键字:窗体 访问 控件 信息 线程 工作 后台 | 更新日期: 2023-09-27 17:56:33
我已经看到了几个关于如何从后台工作线程更改 UI 元素的线程,但我的问题在于相反的过程。我有一个列表视图,其中包含许多项目,旁边带有复选框。我有一个后台工作人员,它应该将数据写出 csv 中在列表视图中检查的项目。我的问题是我无法访问存储在主窗体上的 ListView.CheckedItems 列表。是否有一种优雅的方法可以从后台工作人员访问此数据,或者我是否必须使用一些可怕的解决方法,将列表存储在 EventArgs 参数的参数中?
例如,如果没有跨线程问题,以下代码将为每个已签入的条目创建一个目录:
private void WriteToCSV(Dictionary<string,PointPairList> curves)
{
foreach (KeyValuePair<string, PointPairList> entry in curves)
{
if (SaveListView.CheckedItems.ContainsKey(entry.Key))
{
string curveDir = Path.Combine(this.dirString, entry.Key);
if (!Directory.Exists(curveDir))
{
Directory.CreateDirectory(curveDir);
}
}
}
}
所以问题是,如果从后台工作线程调用此方法,并且"SaveListView"是主窗体上的列表视图,我如何在不引发跨线程异常的情况下访问 SaveListView?
谢谢你能做的任何事情。
这样做的优雅方法是创建一个仅包含您感兴趣的数据(例如目录)的列表,并将其传递给 BackgroundWorker 的DoWorkEventArgs
。
切勿将 Forms 控件传递给后台工作线程;这样做可能会导致跨线程异常、UI 崩溃并导致争用条件,因为 UI 和辅助角色都尝试使用相同的数据。仅将实际需要的数据传递给另一个线程。