Xamarin踩过一个等待的方法

时间:2017-06-14 13:46:45

标签: debugging asynchronous xamarin xamarin.android async-await

在一个WPF应用程序中踩到(F10)一个等待的方法带你到下一行,但是在一个xamarin android项目中它不会那样(就像我按下F5一样)而且我不得不放一个下一行的断点,以便正确调试 - 这是一个痛苦的屁股 - 。

 async Task SomeMethod()
 {
     await Task.Delay(1000); <--------- Stepping over this line leaves the function.
     int x = 1; <--------- I have to add a breakpoint here.
 }

是错误还是功能?

PS:我正在使用Visual Studio 2017.

3 个答案:

答案 0 :(得分:1)

这正是await运算符的工作原理。当await Task时,代码执行将跳出当前函数并将控制权交给其调用者。然后在等待Task完成之后的某个时间点,它将跳回到await语句后执行代码。

如果您跨过await,调试器将导航到您将要执行的下一行代码。如果是await,则很可能不会出现以下行。

答案 1 :(得分:0)

确保您的方法处于异步状态。测试我的&amp;它在我这边工作。示例如下: -

<?php if(!empty($_SESSION['fromARPE'])) { ?>

    <div style="font-size:30px;">Provenance / <br/> Provient de ARPE : </div>
    <div style="position:absolute;left:40%;font-size:70px;" id="provenance"><?php echo $_SESSION['fromARPE']; ?></div>
    <div style="border-bottom:1px solid black; margin-left:35%; width:70%;"></div>';

    <script>
        document.getElementById("provenance").style.top = "80%";
    </script>

<?php } ?>

  Task.Run(async () =>
      {
        await Task.Delay(1000); 
        int x = 1;
      });

答案 2 :(得分:0)

不幸的是,目前Visual Studio调试的工作原理。由于等待Task.Delay()方法,程序流程将返回到调用YourMethod()的方法。如果等待该调用,并且该方法的调用链等待所有等待,直到它到达应用程序上下文。例如。对于Xamarin:

e.g。

 1 class MyActivity : Activity
 2 {
 3     // This function is called by the Xamarin/Android systems and is not awaited.
 4     // As it is marked as async, any awaited calls within will pause this function,
 5     // and the application will continue with the function that called this function,
 6     // returning to this function when the awaited call finishes.
 7     // This means the UI is not blocked and is responsive to the user.
 8     public async void OnCreate()
 9     {
10         base.OnCreate();
11         await initialiseAsync();  // awaited - so will return to calling function
12                                   // while waiting for operation to complete.
13
14         // Code here will run after initialiseAsync() has finished.
15     }
16     public async Task initialiseAsync()
17     {
18         await YourMethod();  // awaited - so will return to Line 11
19                              // while waiting for operation to complete.
20         
21         // Code here will run after GetNamesAsync() has finished.
22     }
23 }

在纯Windows应用程序中,Visual Studio了解应用程序的上下文,并且知道底层方法(程序生命周期,窗口事件,屏幕重绘等)不需要调试(并且源代码不可访问) 。您可能看到的是1000ms的调试器暂停,因为没有要调试的代码。

Xamarin增加了一层代码,包括基类Activity类的实现和所有Android要求。 Visual Studio不知道跳过这些,因此尝试调试任何称为当前等待的方法堆栈的代码。这可能类似于基类Activity类的OnCreate()方法 - 您可能无法访问代码。