使用dispatcher.beginInvoke更新UI

时间:2014-06-01 22:39:38

标签: c# multithreading windows-phone-8 async-await begininvoke

所以,我正在通过移动蓝牙阅读消息,我正在尝试用我收到的数据更新用户界面。

调用另一种方法,更新'方法如下

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)

1 个答案:

答案 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放入其他线程。