System.InvalidOperationException CrossThread с использованием рабочей функции - PullRequest
0 голосов
/ 20 февраля 2020

Я имею дело с ошибкой потока, используя рабочий в моей функции. Я уже проверил привязки и 'invoke' (?), Но я довольно новичок в C# и WPF, и я не совсем понимаю, как мне это решить. Кажется, что я вызываю функцию от другого, который не является "владельцем".

void myLongLastingFunction(0)
{
    line_list.SelectedIndex = 0; //ERROR CrossThread
    blablabla..
}

private void btnClick(object sender, RoutedEventArgs e)
{ 
    BackgroundWorker worker = new BackgroundWorker();
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.WorkerReportsProgress = true;
    worker.DoWork += worker_DoConvertOne;
    worker.ProgressChanged += worker_ProgressChanged;
    worker.RunWorkerAsync();
}

private void worker_DoConvertOne(object sender, DoWorkEventArgs e)
{
    var worker = sender as BackgroundWorker;
    //Processing
    myLongLastingFunction(0);

    //The progress bas is full...
    worker.ReportProgress(100, "Done Processing.");
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("Converting finished!");
    TestProgressBar.Value = 0;
}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    TestProgressBar.Value = e.ProgressPercentage;
}

Я был вдохновлен этим сообщением .

Ошибка появляется, когда Я вызываю myLongLastingFunction (), что приводит к сбою моего приложения:

System.InvalidOperationException: 'Вызывающий поток не может достичь этого объекта, поскольку другой поток является владельцем'

Извините за мой перевод, который, вероятно, неверен, но как можно ближе к исходному сообщению. У тебя есть идеи?

1 Ответ

1 голос
/ 20 февраля 2020

Используйте диспетчер:

void myLongLastingFunction(0)
{
    Dispatcher.BeginInvoke((Action)(() => {
        line_list.SelectedIndex = 0;
    }));
}
...