显然,我不明白如何使用 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/