質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
.NET MAUI

.NET MAUIは、「.NET Multi-platform App UI」の略。単一コードで複数のプラットフォームに対応するクロスプラットフォームフレームワークです。Xamarin.Formsの進化系とされており、XAMLやMVVM に加え、MVUもサポートされています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

289閲覧

.NET MAUI で非同期関数を動悸のように動作させたい

micchi

総合スコア38

.NET MAUI

.NET MAUIは、「.NET Multi-platform App UI」の略。単一コードで複数のプラットフォームに対応するクロスプラットフォームフレームワークです。Xamarin.Formsの進化系とされており、XAMLやMVVM に加え、MVUもサポートされています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2024/05/22 07:54

実現したいこと

JSONをリードしようとしています
ファイルをResourceからリードしようとしているのですが、非同期関数でリード完了してから次の処理に移りたい

発生している問題・分からないこと

ファイルのリードが完了してから次の処理に移りたいが完了せずに他の処理が走ってしまい、
そちらの処理が終わってから実行が戻ってくる

該当のソースコード

c#

1private async Task foo() 2{ 3using Stream stream = await FileSystem.Current.OpenAppPackageFileAsync("data.json"); // ★ ここが終わらないまま他のメソッドが実行される 4using var reader = new StreamReader(stream); 5var contents = reader.ReadToEnd(); 6var data = JsonSerializer.Deserialize<FirmInfo>(contents); 7}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Androidだと、順番通りに実行されるがWindowsだと次の処理が走ってしまう
fooの呼び出しにもawaitを付与してみたが、やはり他のメソッドに処理が移ってしまう

補足

awaitで、該当のメソッドが完了するまで待つと思っているのですが何が問題なのかわからないです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamoto

2024/05/22 08:20

「次の処理が走ってしまう」と言っていますが、その「次の処理」とはどの行のことを言っていますか? 質問に記載されたコードには特に問題点はなく、L4 以降の処理は L3 の処理が完了してから実行されているはずです。
micchi

2024/05/22 12:20

3行目で処理が中断したようになり、 foo()から外に出てfoo以外の関数を実行し、しばらくしたら4行目が実行されました
guest

回答1

0

自己解決

using Task<Stream> streamTask = FileSystem.Current.OpenAppPackageFileAsync("data.json"); streamTask.Wait(); Stream stream = streamTask.Result;

こんなふうに3行目の処理をタスクのTask<Stream>変数として宣言し
Waitとしてから.Resultで結果を代入したら上手く行きました
タスクの使い方を間違っていたみたいです

投稿2024/05/22 12:22

micchi

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2024/05/22 14:22

> 3行目で処理が中断したようになり、 > foo()から外に出てfoo以外の関数を実行し、しばらくしたら4行目が実行されました はい。それがawaitの効果です。 > Waitとしてから.Resultで結果を代入したら上手く行きました > タスクの使い方を間違っていたみたいです いえ。こちらのほうが間違っています。。 今回はそれで問題がないかもしれませんが、WaitやResultは使うべきではありません。 簡単にデッドロックしますし、せっかく非同期の処理になっているのに台無しになってしまいます。 特にUWPやMAUIは非同期版しか用意されていないものが多数あるので、しっかり理解することが重要です。 [非同期プログラミングのシナリオ - C# | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/csharp/asynchronous-programming/async-scenarios) [c# 非同期 デッドロック - Google 検索](https://www.google.co.jp/search?q=c%23+%E9%9D%9E%E5%90%8C%E6%9C%9F+%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問