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();
    }

問題は上位コードにあると思います。私のプログラムの約 1 分間の作業の後にスローされる例外があります。これは例外です:

タイプ 'System.Reflection.TargetInvocationException' の未処理の例外が mscorlib.dll で発生しました

追加情報: 呼び出しのターゲットによって例外がスローされました。

その後、次のメッセージが表示されます。

現在の場所で使用できるソース コードはありません。

ソース コードが少し見にくいことはわかっています。この問題を解決したら、改善します。どうすれば修正できるか教えてください。

4

3 に答える 3

2

問題は次のとおりだと思います。

field.Dispatcher.Invoke

コードのこの部分を try/catch ブロック内に配置して、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 Framework4.0を使用している場合は使用します)を実行する必要がありますか

Task.Factory.StartNew()

于 2010-12-24T23:55:56.170 に答える