繁体   English   中英

在线程之间传递数据

[英]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实际上是在使用它的函数之外定义和创建的,但是它是一个实例,并且不是静态的。

更新 :您似乎已经修改了发布的源代码,所以...

您应该专门为每个后台线程或任务创建DataInterfaceClass的实例。 为您的任务提供足够的输入以创建其自己的实例。

话虽如此,如果您尝试以高度并行的方式访问单个数据库中的数据,则可能会导致数据库超时。 即使您可以使数据访问以多线程方式工作,我还是建议限制同时执行的后台任务的数量,以防止这种情况的发生。

您可以使用Semaphore (或类似Semaphore )来确保同时运行的任务数量不超过一定数量。

在定义了OutputData方法的类内为DataInterfaceClass创建一个全局实例,这样您就可以在该方法中使用它。

但是,您在使用它时需要谨慎。 如果所有线程都将使用同一实例从数据库中读取数据,则会导致错误。

您应该在每个线程中创建DataInterfaceClass的新实例,或者在GetInfo方法中实现一些锁,以避免出现多次访问问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM