1

WPFのアプリケーションでは、踏み越える方法で次の行に移動しますが、xamarinのアンドロイドプロジェクトではそのように振る舞いません(F5を押したようです)。適切にデバッグするために次の行にブレークポイントを置く義務があります - それはお尻の痛みです。Xamarinが待っている方法を踏んで

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これは正確にどのようにawaitオペレータの作品である2017年

+4

xamarinでのデバッグ経験は、通常はバグです。シフトf11は通常、モノ5が来るまで動作していた間にデバッガをクラッシュさせます。もし私があなただったら、私はbugzilla.xamarin.comでそれを報告したいと思います。うまくいけば、彼らはそれを修正することになります。デバッグは通常のwpfアプリケーションと比較してピタである – Dbl

+0

これはたぶん 'async'の機能です - 単に' await'オペレーションのメソッドスコープから外れ、バックグラウンドで継続します。たぶん、あなたは**ちょうど私のコードのチェックボックスをオフに**切り替える必要があります。 – VMAtm

答えて

1

を使用しています。 awaitTaskを実行すると、コード実行が現在の関数から飛び出し、呼び出し元に制御が渡されます。その後、待っているTaskが終了した後のある時点で、awaitステートメントの後にコードを実行するように戻ります。

awaitをステップオーバーすると、デバッガは実行されるコードの次の行に移動します。 awaitの場合は、次の行にはならない可能性が最も高いです。

+4

WPF、Windowsフォーム、またはWindows Phoneでコードを試してください。F10は "int x = 1"に移動し、Xamarin.FormsまたはAndroidで試してみます。 – Akli

0

メソッドが非同期であることを確認してください。テスト済みの鉱山&それは私の側から働いています。以下の例: -

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

または

async Task YourMethod 
    { 
     await Task.Delay(1000); 
     int x = 1; 
    } 
+0

あなたはどのバージョンのVisual Studioをお持ちですか?そしてそれはXamarin Droidにありますか? – Akli

+0

Visual Studio for Macの最新バージョンはXamarin Droidです。 –

0

これは残念ながら、Visual Studioのデバッグは、現在、どのように動作するか、です。 Task.Delay()メソッドが待たれているので、プログラムの流れはYourMethod()というメソッドに戻ります。その呼び出しが待たれていて、そのメソッドへの呼び出しの連鎖がすべて待っていた場合など、アプリケーションコンテキストに到達するまで続きます。例えば。 Xamarinの場合:

純粋なWindowsアプリケーションで

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 } 

は、Visual Studioは、すべてのアプリケーションのコンテキストを知っていて、基礎となる方法(プログラムのライフサイクル、ウィンドウイベント、スクリーン再描画など)はデバッグ(およびソースする必要がないことを知っていますコードにアクセスできない)。あなたが見ているのは、デバッグするコードがないため、1000msの間デバッガを一時停止することです。

Xamarinは、ベースActivityクラスの実装とAndroidのすべての要件のようなもので、コードの余分な層を置きます。 Visual Studioはこれらをスキップすることを知らないので、現在待っているメソッドのスタックと呼ばれるコードをデバッグしようとします。これはおそらく基底ActivityクラスのOnCreate()メソッドのようなものになるでしょう。おそらくコードにアクセスできないでしょう。

関連する問題