2

几天前我开始在 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();
    }

我认为问题来自上层代码。在我的程序运行大约一分钟后抛出异常。这是一个例外:

mscorlib.dll 中出现“System.Reflection.TargetInvocationException”类型的未处理异常

附加信息:调用的目标已引发异常。

之后我收到这条消息:

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

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

4

3 回答 3

2

我想这个问题是一致的:

field.Dispatcher.Invoke

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

TargetInvocationException

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

PS 将整个函数体放在 try/catch 块中;不仅要抓住TargetInvocationException,而且至少要抓住System.Exception它。

于 2010-12-24T22:38:26.530 回答
2

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

try
{
    // code causing TargetInvocationException
}
catch (Exception e)
{
    if (e.InnerException != null)
    {
    string err = e.InnerException.Message;
    }
}
于 2015-09-16T20:25:12.637 回答
0

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

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

Task.Factory.StartNew()

于 2010-12-24T23:55:56.170 回答