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.";
        }
    }

变量“文件名”总是返回“未设置”。似乎从不调用 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/

相关文章:

gradle - Gradle-任务名称的驼峰式保护套-首字母大写

asp.net - 从代码隐藏中调用ASP.NET Web API

c# - swagger-ui 部署后返回 500

c# - 如何从C#的列表中获取第一个字符串?

c# - 为什么 .Equals 在这个 LINQ 示例中不起作用?

c# - 何时或是否在调用 ReadAsStreamAsync 时处理 HttpResponseMessage?

c# - 完成多项任务后如何调用一项任务

c# - 使用ReSharper和对象初始化程序进行间距

c# - 以正确的方式实现 async "yielding"

c# - 如何使用 aspnet ApiVersioning 在 Swashbuckle 中配置 MultipleApiVersions