Task.Delay()挂起几分钟

时间:2016-03-16 19:14:01

标签: c# .net sqlite xamarin deadlock

我正在开发Xamarin.iOS应用程序,我正在调用await Task.WhenAny(tcs.Task, Task.Delay(msTimeout));并将msTimeout设置为8000.问题是,有时它在给定的8000毫秒延迟时未完成并挂起几分钟(见日志)。

我已经读过使用task.Wait()会导致这种行为,但我不会在我的解决方案中的任何地方使用它,我也从Parse SDK opensourced库中删除它(但我想它仍然可以用于其他一些不是开源的库..)。

我还读到使用task.Result会导致这种情况,但我检查了我的解决方案和Parse库,它仅用于某些.ContinueWith(t => return t.Result).OnSuccess情况,我认为这是正常的(如果我错了,请纠正我。)

我也在使用SQLite,最近SQLite也有一些问题,所以它可能与这个问题有关。我使用的是SQLiteAsyncConnection单例实例和SQLiteConnection单例实例。我认为使用两者可能是不好的做法,所以我只是设法使用SQLiteAsyncConnection单例实例,但它没有帮助。

我还尝试在Visual Studio中使用“全部中断”选项来查看下一行代码,但它总是告诉我“框架不在模块中”。

请您分享一下您的想法还有什么可能导致我的应用中出现这些奇怪的问题,或者我怎么能弄明白呢?

修改 我刚刚发现挂起的Task.Delay可能不是挂起状态的根本原因并且因为应用程序在几秒钟之前进入挂起状态而挂起。它确实也影响了SQLite。我会继续调查..

代码:

return await Task.Run(async () =>
   {
      try
      {
           Console.WriteLine("REMOTEREACHABLE 1");
           var tcs = new TaskCompletionSource<bool>();
           var hostEntry = new DnsEndPoint(host, port);
           Console.WriteLine("REMOTEREACHABLE 2");

           using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
           {
               Console.WriteLine("REMOTEREACHABLE 3");
               var socketEventArg = new SocketAsyncEventArgs { RemoteEndPoint = hostEntry };
               socketEventArg.Completed += (s, e) =>
               {
                   Console.WriteLine("REMOTEREACHABLE COMPLETED:" + (e.SocketError == SocketError.Success));
                   tcs.TrySetResult(e.SocketError == SocketError.Success);
               };

               Console.WriteLine("REMOTEREACHABLE 4");
               socket.ConnectAsync(socketEventArg);
               Console.WriteLine("REMOTEREACHABLE 5");
               await Task.WhenAny(tcs.Task, Task.Delay(msTimeout));
               if (!tcs.Task.IsCompleted)
                    Console.WriteLine("REMOTEREACHABLE TIMED OUT");
               var result = tcs.Task.IsCompleted && await tcs.Task;
               Console.WriteLine("REMOTEREACHABLE 6:" + result);
               return result;
           }
      }
      catch (Exception ex)
      {
            Debug.WriteLine("Unable to reach: " + host + " Error: " + ex);
            return false;
      }
});

日志:

2016-03-16 19:32:42.254 AppiOS[3309:6203] REMOTEREACHABLE 1
2016-03-16 19:32:42.259 AppiOS[3309:6203] REMOTEREACHABLE 2
2016-03-16 19:32:42.306 AppiOS[3309:6203] REMOTEREACHABLE 3
2016-03-16 19:32:42.319 AppiOS[3309:6203] REMOTEREACHABLE 4
Thread started:  #8
2016-03-16 19:32:43.039 AppiOS[3309:6203] REMOTEREACHABLE 5
Thread started: <Thread Pool> #9
Thread finished:  #8
Thread started:  #10
Thread finished:  #10
2016-03-16 19:34:05.471 AppiOS[3309:6203] REMOTEREACHABLE TIMED OUT
2016-03-16 19:34:05.478 AppiOS[3309:6203] REMOTEREACHABLE 6:False

1 个答案:

答案 0 :(得分:1)

好的,我终于明白了。这很可能是因为NetworkReachability.TryGetFlags在网络数据包丢失率为100%时或在没有互联网的wifi上阻止了Xamarin.iOS上的应用程序。我正在使用Xamarin Connectivity插件调用里面的TryGetFlags。我描述了问题here。现在我从新线程调用它,返回超时,一切正常。