簡體   English   中英

C#多線程處理-'System.Reflection.TargetInvocationException'

[英]C# multithreading - 'System.Reflection.TargetInvocationException'

幾天前,我開始使用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'的未處理異常

附加信息:調用的目標已引發異常。

之后,我收到此消息:

當前位置沒有可用的源代碼。

我知道我的源代碼有點丑陋,在解決這個問題后,我將使其變得更好。 您能告訴我如何解決嗎?

我想這個問題符合要求:

field.Dispatcher.Invoke

您應該將這部分代碼放入try / catch塊中並進行捕獲

TargetInvocationException

此異常可以提供有關問題所在的更多信息(請注意其InnerException )。

PS將整個功能放在try / catch塊中; 並不僅捕獲TargetInvocationException而且還捕獲至少System.Exception

要解決此類錯誤,請獲取內部異常。 這可能是由於許多不同的問題。

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

處理System.Reflection.TargetInvocationException時,還應注意內部異常。 那可能會告訴您異常情況在哪里。

您還必須執行線程foodThread = new Thread(new ThreadStart(()=>如果我使用的話,我將使用Threadpool.QueueworkerItem或者如果您使用.Net Framework 4.0,

Task.Factory.StartNew()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM