Я разрешаю конечным пользователям загружать файл, затем читать в память и перебирать его для обновления данных. Мне интересно, как я могу сообщить о прогрессе цикла SQL, который я делаю в C #, обратно в пользовательский интерфейс так же, как мы делаем для загрузки файла. Мы используем ajax POST, а затем читаем построчно, поэтому при выполнении больших чтений я хочу узнать, сколько строк мы прочитали. Это возможно, или это работает только с потоками загрузки / выгрузки файлов.
Вот вызов ajax, который выполняет загрузку файла, и, ожидая, пока AJAX вернет ответ, прогресс файла прекрасно работает для загружаемого файла, но не для отслеживания цикла.
var form = $('#FormUpload')[0];
var dataString = new FormData(form);
$("#cboxClose").trigger("click");
$.ajax({
url: '/Uploader/Upload', //Server script to process data
type: 'POST',
xhr: function () { // Custom XMLHttpRequest
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) { // Check if upload property exists
//myXhr.upload.onprogress = progressHandlingFunction
myXhr.upload.addEventListener('progress', progressHandlingFunction,
false); // For handling the progress of the upload
}
return myXhr;
},
//Ajax events
success: uploadSuccessHandler,
error: uploadErrorHandler,
//complete: completeHandler,
// Form data
data: dataString,
//Options to tell jQuery not to process data or worry about content-type.
cache: false,
contentType: false,
processData: false
});
}
Вот часть контроллера C # из MVC, который я вызываю, но я ограничил и сделал логику общей для целей этого вопроса.
try
{
if (uploadedFile != null && uploadedFile.ContentLength > 0)
{
if (uploadedFile != null)
{
if (uploadedFile.ContentLength > 0)
{
using (StreamReader sr = new StreamReader(uploadedFile.InputStream))
{
string currentLine;
int counterLine = 0;
// currentLine will be null when the StreamReader reaches the end of file
while ((currentLine = sr.ReadLine()) != null)
{
if (counterLine > 0)
{
String fixedLine = currentLine;
if (currentLine.Contains("/"))
{
fixedLine = currentLine.Remove('/');
}
string[] columns = fixedLine.Split(',');
quoteDataRows.Add(new QuoteEntityItemVM()
{
Manufacturer = columns[0],
Model = columns[2],
Description = columns[1],
LineID = lineCountId += 1
});
}
counterLine += 1;
}
}
}
}
Есть ли способ, с помощью которого я могу использовать современный AJAX, чтобы не только показывать прогресс выгрузки, но и в то время как циклы счетчика сообщают о прогрессе в пользовательский интерфейс, что-то вроде («Lines read (n) of total line (n)» обратно к пользовательский интерфейс, или это невозможно?
-Thanks-