WPFで,通信を伴うアプリケーションを作ろうとしています.
タイトルの通り,戻り値のいらないメソッドを非同期にしたうえで待機したいのですが,
戻り値を返すように呼び出し先のメソッドを変更する以外に何か良い方法はありますでしょうか?
通信を確立するための,次のようなメソッドを非同期にする際,
cs
1public class Client 2{ 3 // 外部からはこのプロパティで接続状態を確認します. 4 public ENUM_Status Status { get; private set; }; 5 6 public void OpenAsync() 7 { 8 // 文法的にはありえないことですが, 9 // 時間のかかる処理を行って結果を得ているものと考えていただければと思います. 10 bool isSuccessful = Thread.Sleep(10000); 11 if (isSuccessful) 12 { 13 this.Status = ENUM_Status.Connected; 14 } 15 else 16 { 17 this.Status = ENUM_Status.Disconnected; 18 } 19 } 20}
下のように書き換えずに(return を書かずに)済む方法があるかを知りたいです.
cs
1public class Client 2{ 3 // 外部からはこのプロパティで接続状態を確認します. 4 public ENUM_Status Status { get; private set; }; 5 6 public async Task<bool> OpenAsync() 7 { 8 // 文法的にはありえないことですが, 9 // 時間のかかる処理を行って結果を得ているものと考えていただければと思います. 10 bool isSuccessful = Thread.Sleep(10000); 11 if (isSuccessful) 12 { 13 this.Status = ENUM_Status.Connected; 14 } 15 else 16 { 17 this.Status = ENUM_Status.Disconnected; 18 } 19 // プロパティを直接確認すればすむので,戻り値の情報は不要ですが, 20 // 待機するために Task<> を返すようにすると,戻り値が必要なので返しています. 21 return this.Staus == ENUM_Status.Connected; 22 } 23}
この場合,呼び出し元は次のようになります.
cs
1Client client = new Client(); 2await client.OpenAsync(); // 戻り値を格納しない. 3 4// 接続以降の処理.
意味不明です。読んでください⇒ https://teratail.com/help/question-tips
"人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。一見簡単なようですが、実はとても難しいことです"
改善する指針を定めるために,どのような点が意味不明なのかを明確にしていただけるとありがたいです.
> 改善する指針を定めるために,どのような点が意味不明なのかを明確にしていただけるとありがたいです.
(1) アプリは何なのか? コンソールアプリ? WinForms のような GUI アプリ? ASP.NET Web アプリ? それぞれ非同期にする目的が違います。
(2) コードが変です。書き直して少し良くなったがまだダメ。前者が同期、後者がそれを非同期にするよう変更したつもりだと思いますが、非同期になってません (はっきり言ってメチャクチャで議論できるレベルにない)。async 付与すれば非同期になると思ってるなら、それは間違いです。
(3) あなたの言う「下のように書き換えずに済む方法」の「下のように」と言うのがなんなのか意味不明。return ... と書きたくないと言うこと?
先に(1),(3)だけ回答させていただきます.
(1) WPFアプリケーションです.
(3) return を書かずに済む方法があれば知りたいというのが,この質問の意図です.
(2)については,非同期処理を勉強しなおしてきます.すみません.
このコメントは回答欄に移しました。
このコメントは回答欄に移しました。
回答2件
あなたの回答
tips
プレビュー