C # многопоточность - 'System.Reflection.TargetInvocationException' - PullRequest
1 голос
/ 25 декабря 2010

Я начал многопоточное программирование на C # (WPF) несколько дней назад, и вот проблема, которую я не могу решить ... Я использую этот фрагмент кода:

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Random foodPosition = new Random();
        double x,y;
        Size size = new Size(30,30);
        bool foodCreated = false;
        Ellipse food = null;
        Food foodObject = null;
        Thread foodThread = new Thread(new ThreadStart(() =>
            {
                field.Dispatcher.Invoke(new Action(() =>
                {
                    food = new Ellipse();
                    food.Fill = GenerateColor();
                    food.Width = size.Width;
                    food.Height = size.Height;
                    x = foodPosition.Next(0, (int)(playGroundSize.Width - size.Width) + 1);
                    y = foodPosition.Next(0, (int)(playGroundSize.Height - size.Height) + 1);
                    if (IsFree(x, y, size, 0))
                    {
                        playField.Children.Add(food);
                        Canvas.SetTop(food, y);
                        Canvas.SetLeft(food, x);

                        foodObject = new Food(food, new Point(x, y));
                        foodCollection.Add(foodObject,0);
                        foodCreated = true;
                    }
                }));

                if (foodCreated)
                {
                    for (int i = 0; i < foodAliveTime; i++)
                    {
                        Thread.Sleep(1000);
                        foodCollection[foodObject]++;
                    }
                    field.Dispatcher.Invoke(new Action(() =>
                    {
                        playField.Children.Remove(foodObject.FoodObject);
                        //threadList[foodObject].Abort();
                    }));
                }

            }));
        foodThread.Start();
    }

Я думаю, чтопроблема исходит из верхнего кода.После минутной работы моей программы возникло исключение.Это исключение:

Произошло необработанное исключение типа 'System.Reflection.TargetInvocationException' в mscorlib.dll

Дополнительная информация: Исключение было выдано целью вызова.

И после этого я получаю это сообщение:

Нет исходного кода для текущего местоположения.

Iзнаю, что мой исходный код немного уродлив, я собираюсь сделать его лучше после того, как решу эту проблему.Не могли бы вы сказать мне, как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 25 декабря 2010

Я полагаю, что проблема в строке:

field.Dispatcher.Invoke

Вы должны поместить эту часть кода в блок try / catch и перехватить

TargetInvocationException

Это исключение может предоставить больше информации о том, в чем проблема (обратите внимание на InnerException).

P.S. Поместите все тело функции в блок try / catch; и поймать не только TargetInvocationException, но по крайней мере System.Exception после него.

1 голос
/ 16 сентября 2015

Чтобы устранить этот тип ошибки, получите внутреннее исключение. Это может быть связано с рядом различных проблем.

try
{
    // code causing TargetInvocationException
}
catch (Exception e)
{
    if (e.InnerException != null)
    {
    string err = e.InnerException.Message;
    }
}
0 голосов
/ 25 декабря 2010

При работе с System.Reflection.TargetInvocationException следует также учитывать внутреннее исключение. Это может сказать вам, где исключение.

Также вы должны сделать Thread foodThread = new Thread (new ThreadStart (() => Если бы я использовал, я буду использовать Threadpool.QueueworkerItem или если у вас .Net Framework 4.0 используйте

Task.Factory.StartNew ()

...