C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: メソッドの呼び出しについて


(過去ログ 170 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■98263 / inTopicNo.1)  メソッドの呼び出しについて
  
□投稿者/ ワクマン (1回)-(2021/10/26(Tue) 10:41:18)

分類:[C#] 

C#でWPFにてプログラムを組んでいるのですが、メソッドの呼び出しに関してご教授ください。

 READFILE1(W_PATH1);   //@
 READFILE2(W_PATH2);   //A

上記の形でそれぞれのメソッドを呼び出しているのですが、@が終わりきる前にAを呼び出している状態になってしまっています。

 MessageBox.Show("1");

 READFILE1(W_PATH1);

 MessageBox.Show("4");

 READFILE2(W_PATH2);

 MessageBox.Show("7");



 private async void READFILE1(string filePath)
 {
     MessageBox.Show("2");

     ---------------------------

     処理内容

     ---------------------------

     MessageBox.Show("3");
 }

 private async void READFILE2(string filePath)
 {
     MessageBox.Show("5");

     ---------------------------

     処理内容

     ---------------------------

     MessageBox.Show("6");
 }


上記のようにメッセージボックスを仕込んでみたところ、
1→2→4→3→5→7→6の順で表示されました。

READFILE1のメソッドがすべて完了してから、READFILE1を抜けて、次へ進むという形にしたいです。

今までCOBOLしか使った事無かったので、同じ感覚でやっていたら失敗してしまいました。
ご教授いただけたらと思います。
よろしくお願いします。

引用返信 編集キー/
■98264 / inTopicNo.2)  Re[1]: メソッドの呼び出しについて
□投稿者/ とっちゃん (740回)-(2021/10/26(Tue) 11:04:00)
No98263 (ワクマン さん) に返信
>  private async void READFILE1(string filePath)
>  {
>      MessageBox.Show("2");
> 
>      ---------------------------
> 
>      処理内容
> 
>      ---------------------------
> 
>      MessageBox.Show("3");
>  }
> 上記のようにメッセージボックスを仕込んでみたところ、
> 1→2→4→3→5→7→6の順で表示されました。
> 
> READFILE1のメソッドがすべて完了してから、READFILE1を抜けて、次へ進むという形にしたいです。
> 
> 今までCOBOLしか使った事無かったので、同じ感覚でやっていたら失敗してしまいました。
> ご教授いただけたらと思います。
> よろしくお願いします。

READFILE1(2も同様)で、非同期処理するため、戻ってきてしまうのが原因ですね。

MessageBox.Show( "2" );
await なにがしAsync();
MessageBox.Show( "3" );

恐らくこんな感じになってるのだと思います。

非同期処理したほうが良いかどうかは内容次第なのでわかりませんが、
端的に修正するなら

なにがしAsync().wait();

として、同期処理にしてしまうことで段取りをシーケンシャルに進めることもできますが
順番を意識して処理する必要があるなら

READFILE1(2)も待機するようにするほうが良いですね。

具体的には、以下のように戻り値をvoid から Task に書き替えます。

private async Task READFILE1(string filePath)
{
  // ここは同じまま
}

そのうえで、READFILEの呼び出し元でも await で非同期処理を待機するようにします。
// READFILE 呼び出し元の変更
await READFILE1(W_PATH1);

こうすることで全体が処理を待って次に行くようになるので(ただし、大元のメソッドは抜けます)
見た目上は順繰りに動いているように見えます。

引用返信 編集キー/
■98265 / inTopicNo.3)  Re[2]: メソッドの呼び出しについて
□投稿者/ ワクマン (3回)-(2021/10/26(Tue) 11:56:05)
No98264 (とっちゃん さん) に返信
> ■No98263 (ワクマン さん) に返信
>> private async void READFILE1(string filePath)
>> {
>> MessageBox.Show("2");
>>
>> ---------------------------
>>
>> 処理内容
>>
>> ---------------------------
>>
>> MessageBox.Show("3");
>> }
>>上記のようにメッセージボックスを仕込んでみたところ、
>>1→2→4→3→5→7→6の順で表示されました。
>>
>>READFILE1のメソッドがすべて完了してから、READFILE1を抜けて、次へ進むという形にしたいです。
>>
>>今までCOBOLしか使った事無かったので、同じ感覚でやっていたら失敗してしまいました。
>>ご教授いただけたらと思います。
>>よろしくお願いします。
>
> READFILE1(2も同様)で、非同期処理するため、戻ってきてしまうのが原因ですね。
>
> MessageBox.Show( "2" );
> await なにがしAsync();
> MessageBox.Show( "3" );
>
> 恐らくこんな感じになってるのだと思います。
>
> 非同期処理したほうが良いかどうかは内容次第なのでわかりませんが、
> 端的に修正するなら
>
> なにがしAsync().wait();
>
> として、同期処理にしてしまうことで段取りをシーケンシャルに進めることもできますが
> 順番を意識して処理する必要があるなら
>
> READFILE1(2)も待機するようにするほうが良いですね。
>
> 具体的には、以下のように戻り値をvoid から Task に書き替えます。
>
> private async Task READFILE1(string filePath)
> {
> // ここは同じまま
> }
>
> そのうえで、READFILEの呼び出し元でも await で非同期処理を待機するようにします。
> // READFILE 呼び出し元の変更
> await READFILE1(W_PATH1);
>
> こうすることで全体が処理を待って次に行くようになるので(ただし、大元のメソッドは抜けます)
> 見た目上は順繰りに動いているように見えます。
>

上手く順番通りに動くようになりました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -