几天前我在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
其他信息:例外情况 被一个人的目标所抛出 调用
之后我收到了这条消息:
没有可用的源代码 当前位置。
我知道我的源代码有点难看,在解决这个问题之后我会做得更好。你能告诉我如何解决这个问题吗?
答案 0 :(得分:2)
我认为问题符合要求:
field.Dispatcher.Invoke
你应该将这部分代码放在try / catch块中并捕获
TargetInvocationException
此异常可以提供有关问题的更多信息(请注意其InnerException
)。
P.S。
将整个函数放在try / catch块中;并且不仅会抓住TargetInvocationException
,而且会抓住至少System.Exception
。
答案 1 :(得分:1)
要解决此类错误,请获取内部异常。这可能是由于许多不同的问题。
try
{
// code causing TargetInvocationException
}
catch (Exception e)
{
if (e.InnerException != null)
{
string err = e.InnerException.Message;
}
}
答案 2 :(得分:0)
在处理System.Reflection.TargetInvocationException时,还应该查看内部异常。这可能会告诉你异常的位置。
你还需要做Thread foodThread = new Thread(新的ThreadStart(()=&gt;
如果我使用,我将使用Threadpool.QueueworkerItem
或如果您使用.Net Framework 4.0
Task.Factory.StartNew()