![](/img/trans.png)
[英]Xamarin 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.