Xamarin Android try / catch不适用于udp.SendAsync()

时间:2018-10-22 13:29:20

标签: xamarin xamarin.forms xamarin.android try-catch udpclient

我构建了一个简单的应用程序,该应用程序通过UDP与用户指定IP的端点进行通信。它使用<script type="text/javascript"> $(document).ready(function(){ setInterval(function(){ $( "#transactions" ).remove(); const url = 'http://airport-system.tk/api/get_available_transaction'; let jsondata; fetch(url).then( function(u){ return u.json();} ).then(function(json){ //start transaction div var para_transactions = document.createElement("div"); para_transactions.setAttribute("id","transactions"); var element = document.getElementById("body"); element.appendChild(para_transactions); //end transaction div //start col-md-9 div var para_col_md = document.createElement("div"); para_col_md.setAttribute("class","col-md-9"); para_col_md.setAttribute("id","test_col"); var element_transaction = document.getElementById("transactions"); element_transaction.appendChild(para_col_md); document.getElementById("test_col").style.marginTop = '50px'; </script> ,在Android上效果很好-我能够相当一致地发送和接收数据包。有一个明显的例外...例外。它似乎完全逃避了System.Net.Sockets.UdpClient;我的猜测是潜在的实现错误非常困难,无法捕获错误。例如:

try/catch

在实际的Android设备上进行测试时,如果用户输入了错误的IP,则通过UDP ping通该IP的下一步将持续破坏该应用程序。这种行为也是完全怪异的。例如,如果我在后台线程上发出呼叫,就像这样:

UdpClient Udp { get; protected set; }

Udp.Connect("192.168.1.254"); // Any bad IP
try
{
    int bytesSent = await udp.SendAsync(bytes, bytes.Length);
}
catch(Exception ex)
{
    return null;
}

然后在某些情况下我实际上可以获取异常-但仅在外部捕获!抛出发生在内部try内部的Task.Run(ping).ConfigureAwait(false); protected async Task ping() { try { await checkIp(); } catch(Exception ex) { } } 调用上,并且异常是类型为SendAsync的{​​{1}}!取决于我执行过程的精确程度,有时会被发现,有时甚至根本不会被捕获。当它根本不存在时,该应用程序就会崩溃。疯狂!

这是预期的行为吗?难道不应该使用Xamarin UdpClient吗?虫子?比System.Net.Sockets.SocketException更好的方法?其他吗?

0 个答案:

没有答案