3

1 つのファイルをサーバーにアップロードする方法があります。現在、メソッドの悪いコーディングに加えて機能しています(タスクライブラリは初めてです)。

ファイルをサーバーにアップロードするコードは次のとおりです。

private async void UploadDocument()

{
    var someTask = await Task.Run<bool>(() =>
    {
        // open input stream
        using (System.IO.FileStream stream = new System.IO.FileStream(_cloudDocuments[0].FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            using (StreamWithProgress uploadStreamWithProgress = new StreamWithProgress(stream))
            {
                uploadStreamWithProgress.ProgressChanged += uploadStreamWithProgress_ProgressChanged;

                // start service client
                SiiaSoft.Data.FieTransferWCF ws = new Data.FieTransferWCF();

                // upload file
                ws.UploadFile(_cloudDocuments[0].FileName, (long)_cloudDocuments[0].Size, uploadStreamWithProgress);

                // close service client
                ws.Close();
            }
        }

        return true;

    });

}

次に、複数のファイルをドラッグアンドドロップできるListBoxがあるので、ListBoxファイル内でFOR LOOPを実行してから呼び出しますUploadDocument();が、最初にlistBoxに最初のファイルをアップロードし、完了したら2番目のファイルを続行しますファイルなど...

それを行う最善の方法の手がかりはありますか?

どうもありがとう。

4

1 に答える 1

9

あなたはあなたのUploadDocumentリターンをする必要がありますTask。その後、ループ内でタスクを待機できます。例えば:

private async Task UploadAllDocuments()
{
    string[] documents = ...; // Fetch the document names

    foreach (string document in documents)
    {
        await UploadDocument(document);
    }
}

private async Task UploadDocument(string document)
{
    // Code as before, but use document instead of _cloudDocuments[0]
}

実際、UploadDocumentとにかく簡単にすることができます:

private Task UploadDocument()
{
    return Task.Run<bool>(() =>
    {
        // Code as before
    });
}

それをメソッドにラップすることasyncは特に役に立ちません。

(タイプを not に変更することもできます。何がstring何であるかは明確ではありません_cloudDocuments。)

一般に、イベント処理パターンに準拠するためにメソッドを返す必要ない限り、常にasyncメソッドを返す必要があります。TaskTask<T>void

于 2013-02-27T15:28:57.773 に答える