1

ボタンイベント関数には、複数のファイルをダウンロードするための複数のリンクがあります。これらのファイルをダウンロードするには、次のコードがあります。

        for (int l = 0; l < itemLinks.Count(); l++)
        {
            string[] sourceParts = itemLinks[l].Split('/');
            string fileName = sourceParts[sourceParts.Count() - 1];
            WebClient client = new WebClient();
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
            client.OpenReadCompleted += client_OpenReadCompleted;
            client.OpenReadAsync(new Uri(itemLinks[l]));
        }

OpenReadCompletedEventArgs の次の関数では、どのファイルのダウンロードが完了したかを知る必要があります。

    async void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        string pff = e.ToString();
        byte[] buffer = new byte[e.Result.Length];
        await e.Result.ReadAsync(buffer, 0, buffer.Length);

        using (IsolatedStorageFile storageFile =    
                   IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = storageFile
                             .OpenFile(FILE_NAME, FileMode.Create))
            {
                await stream.WriteAsync(buffer, 0, buffer.Length);
            }
        }

        //Also I need to do some stuff here with FILE_NAME
      }

FILE_NAME 値を client_OpenReadCompleted に送信するにはどうすればよいですか?

for ステートメントでのすべての呼び出しで値が変更されるため、値をグローバル変数に保持することはできません。また、変数を += (sender, eventArgs) => として送信しようとしましたが、強制的にコードで待機していますボタンの機能を非同期に変更する

4

2 に答える 2

2

OpenReadAsync「userToken」パラメータを期待するオーバーロードがあります。これはまさにこの目的のために設計されています。

を呼び出すときはOpenReadAsync、変数でこのオーバーロードを使用します。

client.OpenReadAsync(new Uri(itemLinks[l]), fileName);

次に、イベント ハンドラーで取得します。

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    string fileName = (string)e.UserState;

    // ...
}
于 2013-09-15T11:58:12.497 に答える
0

を使用しているため、代わりにawaitを使用すると、よりクリーンなソリューションを利用できます。HttpClientWebClient

await Task.WhenAll(itemLinks.Select(DownloadAsync));

private static async Task DownloadAsync(string itemLink)
{
    string[] sourceParts = itemLinks[l].Split('/');
    string fileName = sourceParts[sourceParts.Count() - 1];
    using (var client = new HttpClient())
    using (var source = await client.GetStreamAsync(itemLink))
    using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
    using (IsolatedStorageFileStream stream = storageFile.OpenFile(FILE_NAME, FileMode.Create))
    {
        await source.CopyToAsync(stream);
    }

    ... // Use fileName
}

CopyToAsyncが WP8 で利用できるかどうかは完全にはわかりません (の一部である可能性がありますMicrosoft.Bcl.Async)。そうでない場合は、行を削除して、次のGetStreamAsync行に置き換えることができますCopyToAsync

var buffer = await client.GetBytes(itemLink);
await stream.WriteAsync(buffer, 0, buffer.Length);
于 2013-09-15T15:23:25.387 に答える