任务继续,包含多个任务。

3

我有一个上传文件到服务器的方法。现在它已经能够正常工作,除了这个方法可能存在一些不良的编码(因为我对任务库还不是很熟悉)。

下面是上传文件到服务器的代码:

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循环,然后调用UploadDocument();。但我想先上传ListBox中的第一个文件,完成后再继续上传第二个文件,以此类推...

你知道最好的方法吗?

非常感谢。

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方法中并不特别有用。

(您可能希望更改类型,而不是使用string - 不清楚_cloudDocuments是什么。)

通常情况下,除非必须使其返回void以符合事件处理模式,否则应始终使async方法返回TaskTask<T>


我刚刚做了那个,有一个问题..当我调用UploadAllDocuments();时,它会用绿色下划线标出,并且当我悬停时,会出现以下提示:"因为此调用未被等待,所以当前方法的执行在调用之前继续执行...." 有什么线索吗? - VAAA
@VAAA:嗯,我们不知道你从哪里调用它...我们甚至不知道这是什么类型的应用程序...所以我无法帮助你展示出来的代码。 - Jon Skeet
这是一个桌面应用程序,我通过点击按钮调用UploadAllDocuments()函数。 - VAAA
@VAAA:好的,所以你可以将事件处理程序也设置为异步,并等待UploadAllDocuments()的结果 - 但是如果在等待之后不打算执行任何其他操作(例如重新启用按钮),那么可能不需要做其他事情。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接