c# - Task.ContinueWith执行顺序

标签 c# task asp.net-web-api

显然,我不明白如何使用 ContinueWith 方法。我的目标是执行一项任务,并在完成后返回一条消息。

这是我的代码:

    public string UploadFile()
    {
        if (Request.Content.IsMimeMultipartContent())
        {
            //Save file
            MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
            Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);

            string filename = "Not set";

            task.ContinueWith(o =>
            {
                //File name
                filename = provider.BodyPartFileNames.First().Value;
            }, TaskScheduler.FromCurrentSynchronizationContext()); 

            return filename;
        }
        else
        {
            return "Invalid.";
        }
    }

变量“filename”总是返回“Not set”。似乎从未调用 ContinueWith 方法中的代码。 (如果我在 VS 中逐行调试它,它确实会被调用。)

此方法正在我的 ASP.NET Web API Controller /Ajax POST 中调用。

我在这里做错了什么?

最佳答案

如果您正在使用异步操作,最好的方法是让您的操作也异步,否则您将失去正在进行的异步调用的优势。尝试按如下方式重写您的方法:

public Task<string> UploadFile()
{
    if (Request.Content.IsMimeMultipartContent())
    {
        //Save file
        MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
        Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);

        return task.ContinueWith<string>(contents =>
        {
            return provider.BodyPartFileNames.First().Value;
        }, TaskScheduler.FromCurrentSynchronizationContext()); 
    }
    else
    {
        // For returning non-async stuff, use a TaskCompletionSource to avoid thread switches
        TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
        tcs.SetResult("Invalid.");
        return tcs.Task;
    }
}

关于c# - Task.ContinueWith执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10502353/

相关文章:

c# - 当类是通用的时找不到 Web API Controller

c# - 如何在 C# 中的特定时间生成警报?

c# - Task.WaitAll 索引越界异常原因

c# - DDD - 跨限界上下文和数据库中不同模式的实体一致性

c# - 如何在 c# cake build 中创建任务以使用 FTP 上传文件?

c# - 为什么在我的 Web API (ASP.NET v5) 项目中添加依赖项无法完全正常工作?

c# - Controller 级别的默认授权角色和方法覆盖

c# - 有没有一种方法可以同步运行 C# 任务并在一行代码中获得结果?

c++ - 在任务的状态被另一个任务更改后重新启动任务

c# - 在非异步方法中同步等待任务完成,但任务永远是 WaitingForActivation