我已经看到了几个关于如何从后台工作者更改UI元素的线程,但我的问题在于相反的过程。我有一个ListView,其中包含许多带有复选框的项目。我有一个后台工作者应该将数据写入csv以查看ListView中检查的项目。我的问题是我无法访问存储在我的主窗体上的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);
}
}
}
}
所以问题是,如果从backgroundworker调用此方法,并且“SaveListView”是主窗体上的listview,如何在不引发跨线程异常的情况下访问SaveListView?
感谢你们所做的一切。
答案 0 :(得分:2)
这样做的优雅方法是创建一个仅包含您感兴趣的数据(例如目录)的列表,并将其传递给BackgroundWorker的DoWorkEventArgs
。
您永远不应将Forms控件传递给BackgroundWorker;这样做可能会导致跨线程异常,崩溃您的UI,并导致竞争条件,因为UI和工作者都尝试使用相同的数据。只将您实际需要的数据传递给另一个线程。