【问题标题】:C# multithreading - 'System.Reflection.TargetInvocationException'C# 多线程 - 'System.Reflection.TargetInvocationException'
【发布时间】:2010-12-24 21:01:07
【问题描述】:

几天前我开始使用 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 中

附加信息:异常有 被目标抛出 调用。

然后我收到这条消息:

没有可用的源代码 当前位置。

我知道我的源代码有点丑,等我解决了这个问题我会改进它。你能告诉我如何解决它吗?

【问题讨论】:

  • 内部异常是什么?另外,我问了另一个涉及相同问题的问题:stackoverflow.com/questions/4269463/…它可能对你有用,虽然我从来没有得到正确的答案
  • 第二; .InnerException 是这里的关键

标签: c# .net wpf multithreading targetinvocationexception


【解决方案1】:

我想这个问题是在线的:

field.Dispatcher.Invoke

你应该把这部分代码放在 try/catch 块中并捕获

TargetInvocationException

这个异常可以提供更多信息是什么问题(注意它的InnerException)。

附: 将整个函数体放在 try/catch 块中;并且不仅可以捕获TargetInvocationException,而且至少可以捕获System.Exception

【讨论】:

    【解决方案2】:

    要解决此类错误,请获取内部异常。这可能是由于许多不同的问题造成的。

    try
    {
        // code causing TargetInvocationException
    }
    catch (Exception e)
    {
        if (e.InnerException != null)
        {
        string err = e.InnerException.Message;
        }
    }
    

    【讨论】:

      【解决方案3】:

      在处理 System.Reflection.TargetInvocationException 内部异常时也应该看看。这可能会告诉您异常在哪里。

      你也必须做 Thread foodThread = new Thread(new ThreadStart(() => 如果我使用我会使用Threadpool.QueueworkerItem 或者如果你有.Net Framework 4.0 使用

      Task.Factory.StartNew()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多