继续处理多个任务

本文关键字:任务 处理 继续 | 更新日期: 2023-09-27 18:01:29

我有一个方法,上传一个文件到服务器。现在正在工作除了任何不好的编码方法(我是新的任务库)。

下面是上传文件到服务器的代码:
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文件中执行FOR LOOP然后调用UploadDocument();但我想先上传ListBox中的第一个文件然后在完成后继续上传第二个文件,等等…

有什么最好的办法吗?

继续处理多个任务

你应该让你的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是什么并不清楚)

一般来说,您应该总是使async方法返回TaskTask<T>,除非使其返回void以符合事件处理模式。