У меня есть следующий код, в котором я пытаюсь обработать большой объем данных и обновить пользовательский интерфейс. Я пытался сделать то же самое, используя фоновый рабочий, но у меня возникла похожая проблема. Кажется, проблема в том, что я пытаюсь использовать класс, который не был создан в новом потоке (фактическая ошибка в том, что текущий поток не «владеет» экземпляром). У меня вопрос, есть ли способ, которым я могу передать этот экземпляр между потоками, чтобы избежать этой ошибки?
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++));
});
}
}
}
EDIT:
DataInterfaceClass фактически определяется и создается вне функции, в которой он используется, но это экземпляр, а не статический.