【问题标题】:Task continue with multiple tasks任务继续执行多个任务
【发布时间】:2013-02-13 11:31:20
【问题描述】:

我有一种方法可以将一个文件上传到服务器。除了方法上的任何错误编码之外,现在正在工作(我是任务库的新手)。

这是将文件上传到服务器的代码:

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 中上传第一个文件完成后继续第二个文件,依此类推...

有什么最好的方法吗?

非常感谢。

【问题讨论】:

    标签: c# task-parallel-library async-await


    【解决方案1】:

    您应该让您的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&lt;T&gt;,除非你让它返回void以遵守一种事件处理模式。

    【讨论】:

    • 我只是这样做了,一个问题..当我调用 UploadAllDocuments();它带有绿色下划线,当我悬停时,我得到:“因为不等待这个调用,所以当前方法的执行在调用之前继续......”有什么线索吗?
    • @VAAA:嗯,我们没有任何关于你从哪里调用它的上下文......我们甚至不知道这是什么类型的应用程序......所以我不能真正帮助您未显示的代码。
    • 它是一个桌面应用程序,我通过单击按钮调用 UploadAllDocuments()。
    • @VAAA:好的,所以你可以使事件处理程序异步,并等待UploadAllDocuments() 的结果 - 但如果你不打算做任何事情在等待它之后(例如重新启用一个按钮),那么您可能不需要做任何其他事情。
    • 太棒了!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多