【发布时间】:2020-08-13 22:13:30
【问题描述】:
我正在从用户上传中读取一个文件,它正在同步工作。我需要更改它以便立即向用户发送“已收到”警报,然后异步读取文件,同时用户会定期轮询以查看读取是否完成。
这是我的代码现在的样子:
public FileUpload SaveFile(Stream stream)
{
FileUpload uploadObj = //instantiate the return obj
var task = Task.Run(async () => await ProcessFileAsync(stream));
return upload;
}
public async Task ProcessFileAsync(Stream stream)
{
StreamReader file = new StreamReader(stream);
CsvReader csv = new CsvReader(file, CultureInfo.InvariantCulture);
while (await csv.ReadAsync())
{
//read the file
}
}
我遇到的问题是,当我调用 csv.ReadAsync() 方法时,Stream 对象已被释放。当我希望SaveFile() 方法向用户返回一个值,但返回的行为会释放 Stream 对象时,如何访问 Stream?
【问题讨论】:
-
如何获取您的信息流?是网络应用吗?
-
是的,用户正在通过 webapp 上传,然后将其发送到我的服务器 API,然后该 API 将流传递给我的方法。
-
目标框架.NET Core 2.1
-
我认为您必须将流复制到 MemoryStream 以将其保存在内存中并将其交给不同的线程。
-
HTTP 是一种请求-响应协议。客户端发送请求,服务器读取并返回响应。以该顺序。在标准 HTTP 文件上传的情况下,文件本身就是请求;在阅读之前,您无法发回响应。您可以通过 AJAX 来模拟这种事情(请参阅this question and answer),但它需要多个请求-响应对。您无法仅从服务器端做到这一点。
标签: c# asynchronous streamreader asp.net-core-2.1