ふらっと C#,C♯,C#(初心者用) Part151

■ このスレッドは過去ログ倉庫に格納されています
2021/05/16(日) 10:45:59.00ID:8qTwOc620
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part150
https://mevius.5ch.net/test/read.cgi/tech/1616471904/
■関連スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
https://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
https://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/06/27(日) 16:42:23.92ID:Zt61L+c30
>>427です
ありがとうございます。
そうか、1度ローカル変数に入れれば良いのですね…思いつかなかった。

具体的には制御装置と通信、データ操作する為のライブラリです。
自分は装置データの参照(○○という制御データの値を取得)しか利用するつもりは無かったのですが、よくよく考えれば、プログラム上で値を保持し続けて、そのデータを更新したりする場合には値を書き換えるのでrefでも良いのかもしれません。
もう一度マニュアルを読み直してみます。
2021/06/27(日) 17:03:53.98ID:bJFlr767a
なぜC#にはメソッドの const 修飾が無いのか
2021/06/27(日) 17:07:52.92ID:Zt61L+c30
>>432
自分で書きましたが違いますね…
○○ってデータを取ってこいという○○の部分は文字列としてメソッドに渡す仕様になっているのでデータそのものは変えていません。
やっぱり特別な意味があるのかもしれません(ないかもしれません)ので改めて確認してみます。
何度も書き込んですいませんでした。
2021/06/27(日) 18:33:32.39ID:t/dm3/tna
普通は意図をもって引数にrefを付けてるはずでしょうw
もちろんメソッドを書いた人が何か勘違いしてる可能性もないことはないが、普通は考えにくいよね。

いずれにせよ、refの引数を取るメソッドに対して

(1) 定数やリテラルを渡したい
(2) refによる「戻り値」は必要ない

こういうケースは普通にありえる。
2021/06/27(日) 18:51:22.05ID:POf4PuR+M
>>435
どういうケース?
2021/06/27(日) 19:15:22.32ID:mGOIcE7NM
TryParseで真偽値だけで要件満たす場合とか普通にあらあな
そもそもこの話は
* 無理なんでラッパメソッドでも噛ましてください
* そんなに気になるなら作者に質問してください。ここは作者の気持ちを予想するスレッドじゃないんでね(文系板に行くといいと思うよ)
で終わってる
438デフォルトの名無しさん (アウアウウー Sad3-kMi9)
垢版 |
2021/06/27(日) 19:25:36.70ID:t/dm3/tna
>>436
あんまり意味がある質問と思えんけど例えば

// EnqueueとDequeueを同時にやる
bool TryEnDeQueue<T>(ref T inOUt> {...}

こんなメソッドがあったとして、キューにリテラルを
突っ込みたいケースは普通にありえるし、
キューから取り出した値は必ずしも使わない(キューの要素数を変えたくないだけ)
というケースもありえるだろう。
2021/06/27(日) 19:26:31.24ID:rwzQBskAM
TryParseって基本TryParse(xxx, out yyy)だろ?
定数渡すのはxxxだし、そもそもrefなんて使ってなくね?
2021/06/27(日) 19:30:25.90ID:rwzQBskAM
>>438
> // EnqueueとDequeueを同時にやる
そんなメソッドが普通にあるって?w
2021/06/28(月) 07:27:53.64ID:3BMv071BM
値渡しではなく参照渡しであることを明記するキーワードのつもりで「ref」を書いてるとかじゃないかな
そういうクソみたいなコードのライブラリを平気で売ってる会社も世の中にはごまんとあるぞ
2021/06/28(月) 07:35:50.99ID:a1dCxCbm0
あたいは確かに値渡したよのさ
2021/06/28(月) 08:58:08.83ID:yki3tuNEa
>>441
const修飾が無い以上、表現として分かりやすいと思う
2021/06/29(火) 08:13:02.33ID:upDN03IZ0
VisualStudioで、C#を使ってプログラムを作成しています。webview2で待機する方法が見つからず困っています。
どう調べても出てこないので、ヤフー知恵袋で聞いてみましたが、回答をいただけず再投稿中です。質問の仕方がよくないのかもしれないですが…。
どうかよろしくお願いします。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14245327539
2021/06/29(火) 08:42:27.78ID:WsUITHRN0
俺も初心者だけど、頑張って非同期処理学んだよ
非同期処理ってネット接続前提のプログラム書くなら避けて通れないんじゃね・・・(と思って俺は頑張った
2021/06/29(火) 11:41:07.64ID:0Q09XEclp
いろいろ勉強したら解決しました。すみません。ありがとうございました。
447デフォルトの名無しさん (アウアウクー MMa3-MDar)
垢版 |
2021/06/29(火) 13:32:10.90ID:+VG1N6hxM
>>446
そういう時って解決した方法を書いて残した方が良い
2021/06/29(火) 17:49:08.51ID:OsdWQKMbD
なぜなら昨日の自分はもはや他人だから!
2021/06/29(火) 19:58:28.59ID:d9qF3Zj0M
イミュータブルなんだな
2021/06/29(火) 21:31:53.28ID:8Hq2zh0T0
ブラウザを貼るって通信できないとき放送事故みたいな感じだな
webアプリでデータだけとって画面表示は自前にせんと商品に見えんな
2021/07/03(土) 10:36:51.73ID:afnPLxcZd
C#ってC++より速度遅いですか?
処理量多いともっさりするって聞いた気がするんです
2021/07/03(土) 11:39:31.05ID:tKf1c0EP0
>>451
遅い
だから速度に頼った実装はできない
画像処理なんかで速度が動作に関わってくるところは
思い切ってc++で組んでもいいかも?
データ移すのに時間かかってて意味なかったよってあるかもしれんが
2021/07/03(土) 11:58:17.56ID:0WAx0SVV0
動作速度と開発速度のどちらに振るか
まあ好きな方でやればいいんじゃね
2021/07/03(土) 12:08:20.73ID:w8WWCmjZ0
UIをC#、
高速化の必要なロジックはC++とかでもいいんじゃないの

最近色んな機械の監視装置とか作るけど、
監視してアラートを上げるところまではC++にしてるよ
2021/07/03(土) 13:13:05.85ID:R7OScebH0
>>451
ボタンのイベントハンドラ内に処理を全部突っ込んで、ボタン押した時にウインドウが「応答無し」になったのを見て
「C#ってモッサリしてるんですね」って言ってる人を思い出した

ライブラリ使わずに自前で画像処理とかするのでもない限り、C#は十分な速度が出るよ
むしろヘタにC++で車輪の再発明されるより、C#でうまくライブラリも活用してくれた方が処理速度も開発速度も早いことが多い

まあ、コンパイラの最適化を超えるような本気で書かれたC++にはもちろん勝てないけど、そんなことができる人はここでそんな質問しないよね
(自分でベンチマークして確かめるから)
2021/07/03(土) 15:13:32.95ID:B0HXpNBH0
>>454
それよく言うけどUI部分でこそ差つくんだよな
WinFormsやWPFでGUI作るとコントロール上でマウス動かすだけでメモリがんがん増えてくしな
OnMouseMoveとか呼ぶたびにオブジェクト生成してるからだと思うけど
2021/07/03(土) 17:54:53.32ID:w8WWCmjZ0
>>456
UIなんか人間相手に間に合えばいいんだから、遅くなっても構わねーだろ
2021/07/03(土) 18:00:13.84ID:ZeViGhZj0
>>457
今後動画のFPSが6を超えなくなる呪いをかけたw

画像関係は「七難隠す」って言われるぐらい
速度が重要だよ
2021/07/03(土) 18:08:16.14ID:IVHyImvm0
>>456
そんな事はない
2021/07/03(土) 18:13:55.16ID:xqsTC6PPM
スレッドセーフじゃないメソッドを擬似的に非同期に見せるためにメッセージループみたいな仕組みを作りたいんだけどなんか簡単な実装方法ってないかな?
非同期キューと無限ループするスレッドを作ってぐるぐる回す的な実装なら作れるんだけど
スレッドが落ちた場合にどうするか、ループぐるぐる回すとCPU無駄じゃないか、でもDelayで待つのもTask大量生成して勿体無い気がする、、、
みたいに考え出すとよくわからなくなった
思考停止して使えるライブラリがあるならそれ使いたい
2021/07/03(土) 18:29:30.32ID:gYtBLHlma
>>460
ちょっと何を言ってるのか。

スレッドセーフとは不特定のスレッドからの呼び出しで問題を起こさないこと。
非同期とはメソッドの処理が呼び出し側と別のスレッドで実行されること。

この2つがどう矛盾するのかさっぱり。
2021/07/03(土) 18:30:29.23ID:ZeViGhZj0
>>460
backgroundWalker が脳筋でも使える
2021/07/03(土) 19:11:11.92ID:xqsTC6PPM
IObservableとかでうまいことできんかな?
2021/07/04(日) 00:40:45.70ID:YIai1OGNM
>>461
非同期処理は単に処理の終了を待たないだけで必ずしも別スレッドは必須じゃない
非同期処理≠並列実行

時間分割のマルチタスクで同じスレッドで実行されるかもしれない
2021/07/04(日) 01:22:13.78ID:xQv4weefa
>>464
C#でわざわざ自分でノンプリエンプティブの
タイムスライスを実装する人っているの?w
OSも乗ってないマイコンの組み込みじゃないんだから
2021/07/04(日) 01:46:34.84ID:pwN2nm3/0
スレッドプールのスレッドで他のスレッドで長い処理しててしかも一つしか空いてなく、かつ最大スレッド数に達してスレッド数増加できなかったら
同じスレッド使ったりとか
2021/07/04(日) 01:58:42.29ID:BjSt84AF0
>>460
キューにBlockingCollection使えば、キューが空の時に待機してくれる
2021/07/04(日) 02:03:43.36ID:QwWGOXoT0
>>467
あれキューに入ってから取り出して処理する間に論理コア全て使われてたら処理待つのかな?
2021/07/04(日) 07:21:36.03ID:8398ur6Y0
SemaphoreSlimじゃダメなん?
2021/07/04(日) 07:31:38.01ID:P9LAGSNy0
>>465
タイムスライスではないけど
同一スレッドで非同期はCompletionTaskSourceで割とやる
ウィンドウが閉じたら完了になるTaskとかね
2021/07/04(日) 23:19:38.18ID:LPsaiBJHM
>>465
c#どうこうじゃなくて一般的に非同期処理って別に他のスレッドを使いますって言ってない
ノンブロッキングなものが非同期であるだけ

初心者が非同期処理を並列処理そのものと勘違いするから嘘を教えないで欲しいだけだ
2021/07/04(日) 23:49:45.24ID:2lvTDu+Ca
>>471
もう言ってること無茶苦茶w
逆である。

「一般的には」マルチスレッドを使って複数の処理を並列に走らせることを非同期という。

VBAみたいなマルチスレッド非対応の環境で疑似的に複数の処理を並列に走らせることを
便宜上「非同期」と呼ぶことはあるいはあるかもしれない。

しかしそれはあくまで括弧つきの「非同期」だ。
一般的な非同期ではない。
2021/07/05(月) 00:05:47.95ID:YTxGqAmPM
>>472
> 「一般的には」マルチスレッドを使って複数の処理を並列に走らせることを非同期という。
プログラムとデバイスで処理を並列に走らせるのも非同期だよ
お前の一般的の世界が狭すぎるだけ
2021/07/05(月) 00:19:55.55ID:7etiVvGGa
>>473
SendXXに対してPostXXを非同期と言ったりもする。
だが>>460はそんな話はしていない。

頭痛いバカだな。少しは文脈を考えてくれ。
こういうバカ、自分がくだらない揚げ足取りをやっている自覚が本気でないんだろうか。
2021/07/05(月) 01:46:57.93ID:9YH14xqL0
単純に処理がブロックされるかされないかなのでは?同期・非同期って
2021/07/05(月) 02:32:04.04ID:lVBHv1fU0
グーグル先生

同期処理では、あるタスクが実行している間、他のタスクの処理は中断される方式です。 非同期処理は、あるタスクが実行をしている際に、他のタスクが別の処理を実行できる方式になります。
2021/07/05(月) 05:09:53.21ID:qo1brwBhM
>>474
お前は自分が「一般的には」と書いたことも忘れたのかよ

> こういうバカ、自分がくだらない揚げ足取りをやっている自覚が本気でないんだろうか。
でかいブーメラン刺さってんぞw
2021/07/05(月) 06:49:42.53ID:2Erd1U7e0
>>475
一票ノシ
2021/07/05(月) 07:40:09.13ID:14em3QBL0
>>472
jsはシングルスレッドだぞ
C#より一般的な言語だからシングルスレッド非同期は一般的とも言える
2021/07/05(月) 08:30:38.62ID:9YH14xqL0
jsはVB6と同じくマルチスレッドをサポートしていない特殊な環境だからね。
2021/07/05(月) 09:22:22.36ID:qo1brwBhM
なんでスレッドにこだわってるの?
VB6もJSもマルチプロセスで走らせられるよ
2021/07/05(月) 09:32:14.42ID:o1i1lUq1M
Async/Awaitはマネージスレッド使ってるケースのほうがむしろ少数派じゃないの
ネットワーク、DB、ファイルIO、どれをawaitしてもマネージスレッドはほとんどの場合シングルスレッドだよ
2021/07/05(月) 10:41:33.34ID:hHXc8jy70
インスタンスをもりもり作ってて思ったのですが、プログラムが実行されているコンピュータにインスタンスが作られているんですよね?
クラサバならクライアント
webサーバならwebサーバに
484デフォルトの名無しさん (ラクッペペ MMc6-Q0eP)
垢版 |
2021/07/05(月) 11:49:46.38ID:d5yMegV0M
歴史をコリエイトする!みたいな?
2021/07/05(月) 11:57:54.93ID:WdSYkRT7M
>>460だが結局Channelで実装したよ
Awaitしやすくて便利やねChannel
もう非同期コレクション要らないんじゃないかな
ぐるぐるスレッドが例外でも補足できないレベルで異常終了したら
どう回復すんのかわからんけどそんなこた無いだろうということで妥協
2021/07/05(月) 13:22:46.85ID:lVBHv1fU0
まあ、c#のお手軽非同期処理って使ってあるところだいたいバグってるよね

スレッドが2つあったら
単位時間あたりの処理の分け前って一体どうなってん?
って計画されてない処理はだいたい本番であの世行きなんだけど
引数にそんなのいれるとこないしねw
2021/07/05(月) 14:37:10.58ID:q4xU82vuM
データベースとの接続やデータのやり取りはEntityFrameorkを使う事が一般的なのでしょうか?
SQLを書くやり方と、EntityFrameorkを使う場合の切り分ける基準はどこになりますか?
2021/07/05(月) 14:50:43.99ID:RRwsgi3K0
開発生産性かな。
テーブル構造がコロコロ変わる開発初期段階でEF使うととっても楽よ。
コードファーストなEFが勝手にDBを変更してくれるから別途DB管理ツールがいらないのでC#のみに集中できる。

すでにかっちりとしたDB(テーブル)があるモデルファーストなら、速度面重視でEFよりdapperかな
EFは機能がリッチな分、テーブル内の大量レコードを扱うと速度面不利なところがある。
小規模人数しか使わないシステムならEFでも全然アリ。
不特定の数万人が使うシステムならEFで初めて方針が固まったところやボトルネック部分を
dapperに置き換えるか、巣のSQL文にしていく。
2021/07/05(月) 16:00:21.70ID:BIU2WbVdM
>>487
今なら迷わずEFでいいと思う
更新系はEF即決
参照系もほとんどEFでいい
生SQLも実はEFで発行可能
マイグレはEFしか選択肢がない
490デフォルトの名無しさん (ワッチョイ 8e67-Z49C)
垢版 |
2021/07/05(月) 19:15:27.44ID:HXCyr6Ze0
try-catchの外からcatchの中にgotoでジャンプって出来ないのね
逆にcatchから抜けるのは出来るみたいだから同じ処理2回書かなくて済んだけど、
ifやループの中にジャンプはできて何故これが出来ないんでしょうか
2021/07/05(月) 20:18:35.29ID:MBPFCQ16M
例外オブジェクトが必須だからだろ
throw;とかどうすんだよ
2021/07/05(月) 23:20:30.17ID:UriEAYwq0
文字列の空を数値の0にする方法ないですか?
2021/07/05(月) 23:34:11.67ID:lVBHv1fU0
変換しろよ
2021/07/05(月) 23:58:24.33ID:ts/O0CHN0
なんか冷たくない?
2021/07/06(火) 00:48:19.77ID:661qfOKl0
なんか隠れてる前提条件にあえて触れたくない
2021/07/06(火) 00:52:48.52ID:661qfOKl0
そしてこれは多分まずい
空文字をゼロにできても
ゼロを空文字には戻せないから
また、元からゼロのモノと空文字だったものもどう判別するのか?
まあ、普通はやんね
仕様から見直す必要があると思われる
2021/07/06(火) 01:00:07.10ID:AJxevGXU0
Ruby on Rails ではデフォルトで、Active Record と言う、O/R マッパー

Web 系では基本、SQL インジェクションされるから、
文字列を結合して、SQL文を作ってはいけない

Place Holder を使っているなら、エラーにされるから良いけど
2021/07/06(火) 08:35:52.20ID:WEJnPcRAM
>>487です

>>488
>>489
ありがとうございます。
早速EntityFrameworkを使用してみました。
コードファーストでDBを作成し、visual studioのSQL Serverオブジェクトエクスプローラー上でもDBが作られている事は確認出来ました。
ただこのデータベースはSQL ServerのSSMS上に表示されていません。
SSMSから見れないのが仕様なのでしょうか?
2021/07/06(火) 08:46:32.39ID:Wb73fCp10
localDBに作っちゃってるんじゃね?
2021/07/06(火) 17:24:46.35ID:h+E/IFQO0
>>492
エスパーだけど文字列を空白で分割したいならばString.Splitとか使えって話ではない?
2021/07/06(火) 19:18:13.51ID:iVjdX3TVM
>>472
言ってることが馬鹿すぎて笑える
2021/07/06(火) 20:38:06.21ID:qUsPK4G40
目が笑ってないんだよな
503デフォルトの名無しさん (ワッチョイ 035f-Ijop)
垢版 |
2021/07/06(火) 21:32:01.28ID:unMXYXmh0
int x = 0;

x == 0
x.Equals(0)
x is 0

なんで3つも書き方があるんだ?
2021/07/06(火) 21:59:56.43ID:PbL+Rk1v0
C#初心者用のスレだが、
コンパイルできる事くらい確かめてから質問しろよ。
なぜ3通りあると思ったんだ?
2021/07/06(火) 22:56:03.78ID:qUsPK4G40
いいから質問に答えろよ穀潰し
2021/07/07(水) 05:58:23.14ID:3z2Vox4wd
>>492
あー、前ゼロ付けたいのね?
外出先のスマホだから調べにくいけど、Formatとかの書式変換みたいなの調べれば良いと思うよ。
ただ空白をゼロにするだけならリプレイスで。
2021/07/07(水) 07:42:20.71ID:7r/+mfxP0
>>503
q)何故か?
a)3通り実装したから
508デフォルトの名無しさん (ラクッペペ MMc6-n/eC)
垢版 |
2021/07/07(水) 11:54:05.00ID:s2USQjL6M
ナイスジョーク!
お前の顔の造形くらいには面白いな
2021/07/07(水) 12:01:06.81ID:Lzprbr4S0
int変数 is 0って書けたっけ?
isって型チェックのみだろ?
2021/07/07(水) 14:43:54.17ID:8EkUrPvp0
.net frameworkと.net coreの2種類ありますけど
.net coreで作った場合、プログラムを動かす環境に.net coreをインストールしてもらわないと動かないのでしょうか?
2021/07/07(水) 15:47:52.56ID:qdKPR4G70
>>510
https://docs.microsoft.com/ja-jp/dotnet/core/deploying/

インストール不要のランタイム丸ごとぶっこ込んで配布する選択肢もあるよ
2021/07/07(水) 17:53:15.05ID:qeN2wEzY0
>>503
マジレスすると
他言語からの移植がしやすいようにするため
片っ端から機能を取り込んだ名残

そして意味不明なc#特有のお便利新機能はすべて
他言語への移植妨害
2021/07/07(水) 17:55:43.88ID:qeN2wEzY0
色んな言語で各社負けじと機能を取り込み&追加したら一つのことやるのに複数の方法があるようになった

ように見える(´∀`*)ウフフ
2021/07/07(水) 18:47:14.86ID:Xt2P64w80
山登るのに登山道複数あってもええやん
2021/07/07(水) 21:20:44.31ID:WowgMcxm0
偽金庫岩を右折な
2021/07/08(木) 06:07:58.03ID:1YfxefkH0
>>503
機能は同じでも仕様の由来というか系統が違うんじゃない?

x == 0 は通常の比較演算子。

x.Equals(0) はメソッド。
自分で比較の条件を組んでIEquatable<T>でオブジェクトに等価性判断の実装したりとか。
ぶっちゃけ、自分で組んだら比較した振りも出来てしまう。

x is 0 はパターンマッチングとかいう奴かな。自分はよく理解してない。
2021/07/08(木) 08:11:23.50ID:4npUp7i4M
== も再定義できるよ

is は悪乗りしすぎ
x is 2 or 3 or 5 なんて書けたりする
2021/07/08(木) 08:55:46.11ID:o2kVhBadM
変数を一回書くだけでいいから便利だね
2021/07/08(木) 18:29:56.70ID:k+qVnEjt0
>>516
== はC言語
Equals はC#
is はVisualBasic(さかのぼるとCOBOL風?)

って感じではないか?
520デフォルトの名無しさん (ワッチョイ 355f-xNKK)
垢版 |
2021/07/09(金) 13:00:38.04ID:oetY1l3k0
>>510
.NET Frameworkが何もなしに動くと思ってそうだなあ
2021/07/09(金) 13:34:58.55ID:LY/QfnIe0
別にそうは思わんが
2021/07/09(金) 17:21:34.33ID:amoMJeJ30
Windows10 May 2019 Update以降なら.NET Framework 4.8が最初からインストールされてるので
ほとんど気にしないで良くなった
2021/07/09(金) 19:04:45.72ID:lAEJntQuM
>>510
Core系(.NET5以降含む)は基本的にWindowsに入ってないことを前提にするのが正しい
頻繁に更新されて全部サイドバイサイドだから、利用者にインストールを要求するのもやめた方がいい
デスクトップアプリなら>>511の言うようにランタイムを丸ごとぶっこむ方式の一択と考えていい
実行環境の.NETランタイムに依存していいのはWebアプリなどでデプロイ先のマシンが完全に自分の制御下にある場合のみ
デプロイ時のファイルサイズを抑えるためのキャッシュみたいなもんだ
2021/07/09(金) 22:48:03.29ID:DRESa+zP0
>>523
全部サイドバイサイドってのは嘘
2021/07/09(金) 22:52:18.07ID:DRESa+zP0
昔は確かにそうだったけど、去年から月次アップデートはMicrosoft Updateで配信されてインプレースインストールできるでしょ?
2021/07/10(土) 05:46:33.21ID:QMdSDj/s0
コンソールアプリでHtmlを取得するプログラムを試しています
ちょっと古いのですが、勉強のため、DownloadStringAsyncを使っています
完了処理を登録したイベントハンドラがうまく動きません。理由はどこにあるのでしょうか?

static void Main(string[] args)
{
var uri = new Uri("https://www.yahoo.co.jp/";);
GetHtml(uri);
}

static void GetHtml(Uri uri)
{
var client = new WebClient();


ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

client.DownloadStringCompleted += Client_DownloadStringCompleted;
client.DownloadStringAsync(uri);
}

private static void Client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
MessageBox.Show(e.Result);
}
2021/07/10(土) 05:46:50.70ID:QMdSDj/s0
DownloadStringAsyncではなく、DownloadTaskAsyncを使った場合はHtmlをちゃんと取得できています。
(文字化けにはまだ対応してませんが)

static void Main(string[] args)
{
var uri = new Uri("https://www.yahoo.co.jp/";);
var result = GetHtml2(uri);
MessageBox.Show(result.Result);
}

static async Task<string> GetHtml2(Uri uri)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
var client = new WebClient();
var result = await client.DownloadStringTaskAsync(uri);
return result;
}
2021/07/10(土) 07:46:29.98ID:EJSmba2ua
結果が帰ってくる前にプログラムが終了するから。
2021/07/10(土) 07:52:08.32ID:Rzopl14C0
>>527はawaitしてるのに>>526はawaitしていないから>>528となる
2021/07/10(土) 08:31:16.30ID:QMdSDj/s0
>>528,529
ありがとうございます

Mainの最期にConsole.Readline();を入れたら動きました
よく見たら自分の使っているテキストにもこれが入ってました
見落としていました

DownloadStringAsyncはawaitには対応していないということなので、>>526をawaitを使って書きかえることはできないという認識でいいですか?
2021/07/10(土) 08:53:52.68ID:Rzopl14C0
>>530
すまんDownloadStringAsyncの仕様を確かめないで妙なレスをしてしまった
それであってます
532デフォルトの名無しさん (ワッチョイ 355f-xNKK)
垢版 |
2021/07/10(土) 09:13:10.13ID:o1Fr1a0g0
.NET Frameworkはもう先がないので今新規開発するなら.NET 5一択
.NET Frameworkからの移行は手間がかかる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況