簡體   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