C# - 如何从后台工作线程访问表单控件中的信息

时间:2014-04-03 19:58:53

标签: c# multithreading backgroundworker

我已经看到了几个关于如何从后台工作者更改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?

感谢你们所做的一切。

1 个答案:

答案 0 :(得分:2)

这样做的优雅方法是创建一个仅包含您感兴趣的数据(例如目录)的列表,并将其传递给BackgroundWorker的DoWorkEventArgs

您永远不应将Forms控件传递给BackgroundWorker;这样做可能会导致跨线程异常,崩溃您的UI,并导致竞争条件,因为UI和工作者都尝试使用相同的数据。只将您实际需要的数据传递给另一个线程。