Task.ContinueWith执行顺序

Riv*_*vka 5 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.";
        }
    }
Run Code Online (Sandbox Code Playgroud)

变量"filename"始终返回"Not set".似乎从未调用ContinueWith方法中的代码.(如果我在VS中逐行调试它会被调用.)

在我的ASP.NET Web API控制器/ Ajax POST中调用此方法.

我在这做错了什么?

car*_*ira 7

如果您正在使用异步操作,最好的方法是使您的操作同步,否则您将失去您正在进行的异步调用的优势.尝试重写您的方法,如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)