[英]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.