所以,我正在通过移动蓝牙阅读消息,我正在尝试用我收到的数据更新用户界面。
调用另一种方法,更新'方法如下
try
{
await update();
}
catch (Exception e)
{
Debug.WriteLine("Exception has been called");
Debug.WriteLine("Type| " + e.GetType());
Debug.WriteLine("Inner Exception| " + e.InnerException);
Debug.WriteLine("Message| " + e.Message);
}
and the update method goes as followes
public async Task<String> update()
{
string[] sMsg = msg.Split(new Char[]{'\n'});
string[] finalmsg = sMsg[0].Split(new Char[]{':'});
if ((finalmsg.Length != 8 && sMsg[0] == msg) || sMsg.Length < 2)
{ // not finished reading
//Debug.WriteLine("\n\n--skip as the size is : " + finalmsg.Length);
return null;
}
msg = msg.Substring(sMsg[0].Length+2,msg.Length-(sMsg[0].Length+2));
if (finalmsg.Length >= 8){
System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate()
{
Dispatcher.BeginInvoke(delegate()
{
string[] fm = finalmsg;
RX.Text = finalmsg[0];
RY.Text = finalmsg[1];
LX.Text = finalmsg[2];
LY.Text = finalmsg[3];
RF1.Text = finalmsg[4];
RF2.Text = finalmsg[5];
LF1.Text = finalmsg[6];
LF2.Text = finalmsg[7];
});
}
));
thread.Start();
if(!thread.IsAlive)
thread.Abort();
}
return finalmsg[0];
}
}
所以我现在面临的问题是,更新Dispatcher.BeginInvoke主体中的UI工作20秒,然后触发一个异常
exception has been thrown by the target of an invocation
在App.xaml,Application_UnhandledException方法中触发了异常 这意味着代码中没有处理异常,即使使用try子句也无法捕获。
我现在在想的是我犯了一个错误,因为我真的不明白dispatcher.beginInvoke
那么请你就这里可能出错的地方提出建议吗? 提前谢谢。
编辑: 详细说明这是我得到的异常的堆栈跟踪
堆栈追踪:
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.UnsafeInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam* pParams, ScriptParam* pResult)
答案 0 :(得分:1)
如果有另一个可能与您的线程冲突的处理,则需要在Dispatcher线程上完成UI更新部分,因此请修改您的代码:
public string update()
{
string[] sMsg = msg.Split(new Char[]{'\n'});
string[] finalmsg = sMsg[0].Split(new Char[]{':'});
if ((finalmsg.Length != 8 && sMsg[0] == msg) || sMsg.Length < 2)
{ // not finished reading
//Debug.WriteLine("\n\n--skip as the size is : " + finalmsg.Length);
return null;
}
msg = msg.Substring(sMsg[0].Length+2,msg.Length-(sMsg[0].Length+2));
if (finalmsg.Length >= 8){
Dispatcher.BeginInvoke(delegate()
{
string[] fm = finalmsg;
RX.Text = finalmsg[0];
RY.Text = finalmsg[1];
LX.Text = finalmsg[2];
LY.Text = finalmsg[3];
RF1.Text = finalmsg[4];
RF2.Text = finalmsg[5];
LF1.Text = finalmsg[6];
LF2.Text = finalmsg[7];
});
}
return finalmsg[0];
}
只需确保修改代码,以便在Dispatcher中进行UI更新。不需要将Dispatcher放入其他线程。