[過去ログ] ふらっと C#,C♯,C#(初心者用) Part141 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
429(1): デフォルトの名無しさん [sage] 2020/05/07(木) 09:40:06 ID:qpGBsCgy(1/6) AAS
>>418418(6): デフォルトの名無しさん [sage] 2020/05/07(木) 08:09:53 ID:uSRgeDXp(1/11) AAS
なぜ?は正常にダウンロードできないのか教えて下さい
よろしくお願いします
?aaa.csvが作成されるのですが0 byteの空のcsvです
var url1 = new Uri("外部リンク:tekitou
var csv1 = "aaa.csv";
var wc1 = new WebClient();
wc1.DownloadFileAsync(url1, csv1);
?これは正常にダウンロードできます
var url2 = "外部リンク:tekitou
var csv2 = "bbb.csv";
var wc2 = new WebClient();
wc2.DownloadFile(url2, csv2);
?上の2つを1つのメソッドの中に並べてから実行するとなぜかaaa.csv、bbb.csvともに正常にダウンロードできます
var url1 = new Uri("外部リンク:tekitou
var csv1 = "aaa.csv";
var wc1 = new WebClient();
wc1.DownloadFileAsync(url1, csv1);
var url2 = "外部リンク:tekitou
var csv2 = "bbb.csv";
var wc2 = new WebClient();
wc2.DownloadFile(url2, csv2);
非同期にダウンロードするなら、ダウンロード終了を待たないとそりゃ中身0バイトでしょ。
Mainをasync voidにして、awaitしなよ。
431(1): デフォルトの名無しさん [sage] 2020/05/07(木) 10:59:06 ID:qpGBsCgy(2/6) AAS
>>430430(1): デフォルトの名無しさん [sage] 2020/05/07(木) 10:52:25 ID:uSRgeDXp(7/11) AAS
>>429
へとへとになりましたがいけました・・・・
一応報告です
async voidはダメだという記述をどこかでみました(ぐぐりまくった結果ソースがどこかわからない)
async Task MainでいけるということですがC#7.1を有効にするためごにょごにょしました
awaitをつけたところ戻り値voidのメソッドはだめだと怒られたのでDownloadFileTaskAsyncに変えてみました
static async Task Main(string[] args)
{
var url1 = "外部リンク:tekitou
var csv1 = "aaa.csv";
var client = new WebClient();
await client.DownloadFileTaskAsync(url1, csv1);
}
なんだか胃が痛くなってきました
ありがとうございました・・・
async void申し訳ない、雰囲気で話してしまったので裏を取るべきだった。
aync Taskだな、おっしゃるとおり。
行けて良かった。
438(1): デフォルトの名無しさん [sage] 2020/05/07(木) 14:18:23 ID:qpGBsCgy(3/6) AAS
>>432432(3): デフォルトの名無しさん [sage] 2020/05/07(木) 11:08:02 ID:uSRgeDXp(8/11) AAS
>>431
ありがとうございました。
ダウンロード終了を待たないとそりゃ中身0バイトでしょの一言が貴重でした
ちなみにですが、
外部リンク[html]:dobon.net
「.NET Framework 2.0以降で、非同期的にファイルをダウンロードし保存する」
で紹介されているC#のコードですが、ここではawaitが出てこない
その理由は、
コンソールアプリと違ってフォームを表示しているメインのスレッドは勝手に終了しないから
という理解でよいでしょうか?
コンソールアプリだとメインで走っているスレッドはコードの最後まで行けば勝手に終わってしまう。そのため、ダウンロードに関わっているスレッドもそれに引きずられて終わってしまう
と考えたのですが・・・
その認識で良いよ。
メインスレッドは終わらないからで大丈夫だと思う。
439(1): デフォルトの名無しさん [sage] 2020/05/07(木) 14:25:50 ID:qpGBsCgy(4/6) AAS
>>437437(2): デフォルトの名無しさん [sage] 2020/05/07(木) 13:46:41 ID:uSRgeDXp(10/11) AAS
>>435
一番知りたいのはフォームアプリとコンソールアプリでなぜこのような違いがでるのかっていう点ですね
それについては>>432の理解でよいのでしょうか
前半は肯定してもらったのですが、後半はどうでしょうか
>DownloadFileAsyncはイベントベースで完了を待つ(ことができる)もの
DownloadFileTaskAsyncでもcompletedイベントハンドラが動きました
とここまで書いて一発で疑問を解決してくれるコードを発見です
static void Main(string[] args)
{
var url1 = new Uri("外部リンク:tekitou
var csv1 = "aaa.csv";
var client = new WebClient();
client.DownloadFileAsync(url1, csv1);
Console.ReadLine();
}
もちろんこれがアプリの中で使えるということではないんですが
基本の基本となる理屈がこれで分かりました
コンソールとフォームの違いに重点を置いた説明ってなかなか見当たらないんですよね
どちらかに特化したものはあちらこちらにあるんですけど。
そのせいで頭に生じた矛盾点が解決できず基本理解が大きくゆれていたんです
あと、>>418の?で順番を逆にしたら期待通りの結果が得られました
解決です
ManualResetEventのWaitOneで待ち構えて、CompletedイベントでManualResetEventにSetしてあげるとかが王道なのかな。
そういう事しなくて済むようにしたのがAsyncだとは思うけど。
ManualResetEventのWaitOneは、Console.CancelKeyPressに紐付ける形でよく使うかもしれん。
フォームアプリでどうして大丈夫か、は、一回Program.csをよく読んでみたら良いんじゃないかな。
外部リンク[run]:docs.microsoft.com
447: デフォルトの名無しさん [sage] 2020/05/07(木) 15:42:15 ID:qpGBsCgy(5/6) AAS
GUIアプリがイベントベースってのは誤解を生みそうで好かんな。
結局アプリケーションメッセージループを理解しないと、真っ白になるGUIアプリ作ることになる。
CUIアプリでもちゃんとしたアプリ作るとなると普通はイベントループ的な部分を作るんだし、あんまり誤解を生みそうな発言は良くないんじゃないの?
450: デフォルトの名無しさん [sage] 2020/05/07(木) 16:34:06 ID:qpGBsCgy(6/6) AAS
それが理解できてれば、CPU利用率の話は暴論だと理解できるはずなんだが。
UIスレッドとそれ以外のスレッドとか、ちゃんと頭に浮かんでる?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.037s