У меня есть следующий код, в котором я пытаюсь обрабатывать большой объем данных и обновлять пользовательский интерфейс. Я пробовал то же самое, используя фона рабочего, но я получаю аналогичную проблему. Проблема заключается в том, что я пытаюсь использовать класс, который не был создан в новом потоке (фактическая ошибка заключается в том, что текущий поток не «владеет» экземпляром). Мой вопрос в том, есть ли способ передать этот экземпляр между потоками, чтобы избежать этой ошибки?Передача данных между потоками
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 фактически definated и создается вне функции, она используется в, но это экземпляр и не статична.
Я обновил вопрос, поскольку он появился, поскольку DataInterfaceClass был статичным - это не так. Что касается количества одновременных задач, цель этого заключается в простом обновлении пользовательского интерфейса при его запуске (так что я не ожидаю, что доступ к данным будет одновременно синхронным). –
@ pm_2: Если вы не хотите одновременного доступа, вы должны поместить оба цикла foreach в один рабочий элемент, а не в очередь на работу внутри внутри вложенного цикла. – Thorarin