我尝试创建一个可以运行处理上传过程的异步进程的API,并立即返回,让用户知道文件上传过程已经开始。从这里开始,我想创建一个API来询问上传的状态。
这在网络领域是否可行?如果没有,我必须等到整个文件被处理完毕,该API是否仍可用于多个请求?
到目前为止,这是我的代码,目前它到达帖子中的某个字节并失败。
public async Task<IHttpActionResult> Post()
{
var stream = HttpContext.Current.Request.GetBufferlessInputStream(true);
// Begin Upload
Task.Run(() => BeginUpload(stream));
// Return upload begin successful
return Ok($"Upload started! # {0}");
}
private async Task<int> BeginUpload(Stream stream)
{
using (var reader = new StreamReader(stream))
{
var index = 0;
var buffer = new char[100000000];
while (!reader.EndOfStream)
{
await reader.ReadBlockAsync(buffer, index, 1024);
index += 1024;
Debug.Write($"{index}\n");
}
}
return 0;
}
答案 0 :(得分:0)
您可以考虑HostingEnvironment.QueueBackgroundWorkItem而不是使用Task.Run()。例如:
public IHttpActionResult Post()
{
var stream = HttpContext.Current.Request.GetBufferlessInputStream(true);
// Begin Upload
HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await BeginUpload(stream));
// Return upload begin successful
return Ok($"Upload started! # {0}");
}
private async Task BeginUpload(Stream stream)
{
using (var reader = new StreamReader(stream))
{
var index = 0;
var buffer = new char[100000000];
while (!reader.EndOfStream)
{
await reader.ReadBlockAsync(buffer, index, 1024);
index += 1024;
Debug.Write($"{index}\n");
}
}
}
在这种情况下,您不必等到读者完成其工作。