2

WebClient.DownloadFileAsync の実験:

public void DownloadFile(string fileUrl, string localFile)
{
    using (WebClient client = new WebClient())
    {
        downloadingFile = true;
        client.DownloadFileCompleted += client_DownloadFileCompleted;
        client.DownloadFileAsync(new Uri(fileUrl), localFile);

        while (downloadingFile) { };
    }
}

private void client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    downloadingFile = false;
}

問題は、 DownloadFileCompleted イベントが発生しないことです。そのため、downloadingFile = false => while ループが決して終了しないように設定することはありません。

何がうまくいかないのかについてのアイデアはありますか?

ありがとう!

4

2 に答える 2

1

これは、論理的な間違い (一種のデッドロック状況) のようです。なぜなら、メイン スレッドが条件を超えて継続的にループしており、ダウンロードが完了してもイベントを発生させる時間がないためです。

解決策 1: while (downloadingFile) { }; を削除します。メインスレッドを解放する行。制御フローを保持したい場合は、メソッド DownloadFile を非同期にし、次のコード行を使用して DownloadFile メソッドの待機可能なバリアントを作成できます。

await client.DownloadFileTaskAsync(new Uri(fileUrl), localFile);
于 2016-01-14T05:49:23.663 に答える
0

イベントハンドラ (Client_DownloadFileCompleted) から型 AsyncCompletedEventHandler のインスタンスを返す必要があり、void ではありません。

詳細については、 MSDN リンクを参照してください。

于 2016-01-14T05:39:04.017 に答える