我有一个“通用的”锅炉板静态方法,用于检查invokeRequired并相应地调用相关的操作。
如果操作引发了未处理的异常,那么堆栈跟踪就没有多大帮助,因为它从这里开始。我可以得到关于控制的信息,但这并不总是有什么帮助。我想知道是否有可能从行动中得到“有用的东西”——另一个“目标”。(请注意,该操作通常是lambda或匿名委托…)
public static void Invoke(Control ctrl, Action action)
{
if (ctrl == null)
throw new ArgumentNullException("ctrl");
if (action == null)
return;
var invokeRequired = ctrl.InvokeRequired;
try
{
if (ctrl.InvokeRequired)
ctrl.Invoke(action);
else
action();
}
catch (Exception ex)
{
throw new Exception(String.Format("Invoke error, ctrl={0}, action Target={1}", ctrl.Name, action.Target), ex);
}
}
编辑:根据这个答案,这里是新的过载(也有轻微的改进)
public static void Invoke(Control ctrl, Action action, string context)
{
if (ctrl == null)
throw new ArgumentNullException("ctrl");
if (action == null)
return; //not sure it's worththrowing an exception here...
var invokeRequired = ctrl.InvokeRequired;
try
{
if (invokeRequired)
ctrl.Invoke(action);
else
action();
}
catch (Exception ex)
{
var ps = invokeRequired ? "" : " - has the target control been initialised?";
var errmsg = String.Format("Invoke error, ctrl={0}, action Target={1}, context={2}{3}", ctrl.Name, action.Target, context, ps);
throw new Exception(errmsg, ex);
}
}