[英]Passing Data Between Threads
我有以下代码,其中我试图处理大量数据并更新UI。 我已经使用后台工作者尝试了同样的事情,但是遇到了类似的问题。 问题似乎是我正在尝试使用未在新线程上实例化的类(实际错误是当前线程不“拥有”实例)。 我的问题是,有没有一种方法可以在线程之间传递该实例以避免该错误?
DataInterfaceClass dataInterfaceClass = new DataInterfaceClass();
private void OutputData(List<MyResult> Data)
{
progressBar1.Maximum = Data.Count;
progressBar1.Minimum = 1;
progressBar1.Value = 1;
foreach (MyResult res in Data)
{
// Add data to listview
UpdateStatus("Processing", res.Name);
foreach (KeyValuePair<int, string> dets in res.Details)
{
ThreadPool.QueueUserWorkItem((o) =>
{
// Get large amount of data from DB based on key
// – gives error because DataInterfaceClass was
// created in different thread.
MyResult tmpResult = dataInterfaceClass
.GetInfo(dets.DataKey);
if (tmpResult == null)
{
// Updates listview
UpdateStatus("Could not get details",
dets.DataKey);
}
else
{
UpdateStatus("Got Details", dets.DataKey);
}
progressBar1.Dispatcher.BeginInvoke(
(Action)(() => progressBar1.Value++));
});
}
}
}
编辑:
DataInterfaceClass实际上是在使用它的函数之外定义和创建的,但是它是一个实例,并且不是静态的。
在定义了OutputData
方法的类内为DataInterfaceClass
创建一个全局实例,这样您就可以在该方法中使用它。
但是,您在使用它时需要谨慎。 如果所有线程都将使用同一实例从数据库中读取数据,则会导致错误。
您应该在每个线程中创建DataInterfaceClass
的新实例,或者在GetInfo
方法中实现一些锁,以避免出现多次访问问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.