2011-01-10 75 views
0

我有以下代码,其中我试图处理大量的数据,并更新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实际上definated并且它使用的功能之外创建的,但它是一个实例,而不是静态的。

回答

1

UPDATE: 你似乎已经修改了发布的源代码,所以...

您应该专门创建DataInterfaceClass的实例,每个后台线程或任务。为您的任务提供足够的输入来创建自己的实例。这就是说,如果您尝试以高度并行的方式访问单个数据库中的数据,这可能会导致数据库超时。即使您可以让您的数据访问以多线程方式工作,我也会建议限制同时执行的后台任务数量以防止发生这种情况。

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

+0

我更新了问题,因为它确实出现DataInterfaceClass是静态的 - 事实并非如此。至于同时执行任务的数量,其目的仅仅是让进程在运行时更新UI(所以我不认为数据访问是同时发生的)。 – 2011-01-10 11:45:36

0

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

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

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