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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

Q&A

解決済

2回答

3696閲覧

WindowsFormからのWebAPIの非同期呼び出し

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

0グッド

0クリップ

投稿2022/01/20 06:49

前提・実現したいこと

既に実装されて提供されているASP.NET WebAPIで実装されたAPIを呼び出して、サーバで生成されたデータをクライアントにダウンロードしたいです。クライアントはWindowsFormです。
開発環境はVS2022、.NET6です。

用意されているAPIの概要

①データ作成要求API
条件を渡して呼び出すと、API側でデータ作成用のバッチを起動してその処理状態を管理するレコードを
DBに登録する。登録されたときの主キーを応答データでかえす。

②データ作成バッチ
DBに処理状態を「処理中」で更新して処理を開始する。処理が終わったら処理状態を「処理終了」で更新して、作成されたデータをファイルとしてサーバに出力する。

③データ取得API
データ作成用のバッチ処理が作成したデータを取得する。
データ作成バッチが実行中で、まだデータが出力されていない場合、ステータスを「処理中」、データを空で返す。データが出力されている場合、ステータスを「処理終了」、サーバに出力されたデータを返す。

解決したいこと・教えていただきたいこと

②データ作成バッチはそれなりに時間がかかることが分かっています。
(②データ取得APIを何度か呼び出さないと、データが取得できない)そのため、WindowsFormからの呼び出しは非同期処理
とすべきだと考えています。ただし、上記一連の処理はクラスライブラリに実装し、
WindowsFormからはクラスライブラリのメソッドを呼び出して処理をさせるように指示をうけています。

非同期処理についてあまりくわしくないのですが、こういった条件だと、どのように実装すべきでしょうか?
サンプルになるようなコード等教えていただけると嬉しいです。それを見ながら非同期処理も含め勉強したいと思っています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問が適切ではなかったので解決しませんでした。

投稿2022/01/20 12:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/01/20 12:29

そんなのは自己解決ではありません。
guest

0

質問は以下のところ、

非同期処理についてあまりくわしくないのですが、こういった条件だと、どのように実装すべきでしょうか?

・・・即ちクライアント側の WinForms アプリから Web API を非同期で要求して応答を処理するところだと理解してレスします。

ASP.NET Web API ということですから認証はトークンベースになって、クライアントは HttpClient を使い、データの受け渡しには JSON 文字列を使うということになると想像しています。

以下のその簡単なサンプルの記事を紹介しておきます。認証トークンの取得もデータの取得も HttpClient を使って非同期に行っています。

HttpClient で ASP.NET Web API にアクセス
http://surferonwww.info/BlogEngine/post/2019/09/29/call-aspnet-web-api-from-httpclien.aspx

他に、上の記事にも書いてありますが、HttpClient を使ったアプリから Web API にアクセスするには Microsoft のドキュメント Call a Web API From a .NET Client (C#) で紹介されている Microsoft.AspNet.WebApi.Client を使う方法もあります。そのドキュメントへのリンクが張ってあるのでそちらも見てください。

もう一つのサンプルとして、IHttpClientFactory を利用して HTTP 接続プールを作り、それから HttpClient インスタンスを取得してアクセスする方法を書いた記事を紹介しておきます。

Windows Forms で IHttpClientFactory 利用 (CORE)
http://surferonwww.info/BlogEngine/post/2021/03/12/how-to-use-ihttpclientfactory-in-windows-forms-application.aspx

HttpClient のインスタンスを生成すると、そのたびにソケットも生成されます。しかし、HttpClient のインスタンスを Dispose してもソケットはすぐにはクローズされないので(デフォルトで 4 分かかるそう)、短期間で何度も生成 / Dispose を繰り返すとソケットの枯渇につながるという問題があり、それを避けるため、HttpClient のインスタンスはシングルトンにしてアプリで使いまわすということが推奨されています。ただし、長期にわたってシングルトンにした HttpClient のインスタンスを使い続けると、DNS の変更が反映されないという別の問題があるそうです。

IHttpClientFactory オブジェクトを利用することにより HTTP 接続プールが生成でき、プールから HttpClient を取得して使うことにより上記の問題(socket の枯渇と DNS の変更)を回避できるそうです。

投稿2022/01/20 07:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/01/20 08:11

非同期API呼び出しの部分はよくわかりました。ありがとうございました。 あとよくわからないのが、何度か繰り返し呼び出して待つ部分です。 雰囲気は以下のようになるのかと考えていますが、もう少し具体的にどんな風に実装すべきなのかが いまいちわかっていません。 // Formから呼び出すクラスライブラリのメソッド static async Task<string> GetData(string guid) { while(1) { // 1秒間隔で Sleep(1000) // APIの結果を非同期で取得 // 取得結果が望む結果なら抜けて答えを返す } } // WindowsForm側のイベント private void TestButton_Click(object sender, EventArgs e) { // 非同期でAPIを利用してデータを取得する awit ApiYobidashi.GetData("29F7FCB35FF54D53A68043AD28FE3A9D"); // 次の処理? }
退会済みユーザー

退会済みユーザー

2022/01/20 09:02 編集

> あとよくわからないのが、何度か繰り返し呼び出して待つ部分です。雰囲気は以下のようになるのかと考えていますが、もう少し具体的にどんな風に実装すべきなのかがいまいちわかっていません。 そこは質問者さんと顧客の間の仕様・要件、Web API の実装などによります。そのあたりが分からない第三者に聞いても答えられる話ではありません。ポーリングで要件を満たすならそれでもいいんじゃないの・・・というような無責任な返事しかできません。 質問者さん、業務の一環としてやっているようですが、であれば上司・先輩に相談することをお勧めします。
退会済みユーザー

退会済みユーザー

2022/01/20 09:03

> ポーリングで要件を満たすならそれでもいいんじゃないの・・・というような無責任な返事しかできません。 ポーリングで要件を満たすとして、実装サンプルなど教えていただくことは可能でしょうか? 無責任でも差支えありません。
退会済みユーザー

退会済みユーザー

2022/01/20 09:10 編集

質問者さん、業務の一環としてやっているようですが、であれば上司・先輩に相談することをお勧めします。質問者さんと顧客の間の仕様・要件、Web API の実装などによります。そのあたりが分からない第三者に聞いても答えられる話ではありません。
退会済みユーザー

退会済みユーザー

2022/01/20 09:09

わかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問