Метод Async в foreach не возвращает данные результата JSON при использовании ожидания Task.WhenAll(listOfTasks)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Метод Async в foreach не возвращает данные результата JSON при использовании ожидания Task.WhenAll(listOfTasks)

Сообщение Anonymous »

`public async Task GetEmployeeLeaveHistory(int page, int rows)
{
var empLeaveHistory = rr.GetLeaveApp(Convert.ToInt32(HttpContext.Session["EmpId"]));

Код: Выделить всё

        int pageIndex = Convert.ToInt32(page) - 1;
int pageSize = rows;
int totalRecords = empLeaveHistory.Count();
int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
var reqs = empLeaveHistory.OrderByDescending(m => m.DateFiled).Skip(pageIndex * pageSize).Take(pageSize);
var rowsObj = new object[pageSize > totalRecords ? totalRecords : pageSize];

//var rowsObj = new List();

List listOfTasks = new List();

int i = 0;
foreach (var req in reqs)
{
listOfTasks.Add(rr.ObjectRowsAsync(req, rowsObj, i));
i++;
}
System.Diagnostics.Debug.WriteLine($"Total tasks to be awaited: {listOfTasks.Count}");

await Task.WhenAll(listOfTasks);

if (totalRecords != 0)
{
for (int j = 0; j < rowsObj.Length; j++)
{
if (rowsObj[j] == null)
{
rowsObj[j] = new { id = j, cell = new object[] { j, j, "", "", "", "", "", "", "", "", "", "" } };
}
}
}

var result = new JsonResult
{
Data = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = rowsObj
}
};

System.Diagnostics.Debug.WriteLine($"Result Data: {result.Data}");

return result;
}`
Это метод:

Код: Выделить всё

    public async Task ObjectRowsAsync(LeaveHeader req, object[] rowsObj, int i)
{
SemaphoreSlim semaphore = new SemaphoreSlim(5);
try
{
await semaphore.WaitAsync();
if (req.LeaveType.LeaveTypeDesc != "DPS")
{

using (var context = new GeoPIMSEntities())
{

var leaveHeaderTask = context.LeaveHeaders
.AsNoTracking()
.Where(lh => lh.LeaveHeaderId == req.LeaveHeaderId)
.Select(lh => new
{
lh.RecommenderId,
lh.ApprovalOfficialId,
lh.TotalDays,
lh.IsPosted,
lh.Remarks,
lh.IsApproved,
lh.IsRecommended,
lh.IsCancelled,
lh.IsDisapproved,
lh.Reason
})
.FirstOrDefaultAsync();

Task recommendedByNameTask = context.People
.AsNoTracking()
.Where(p => p.PersonId == req.RecommenderId)
.Select(p => p.CompleteName)
.SingleOrDefaultAsync();

Task approvedByNameTask = context.People
.AsNoTracking()
.Where(p => p.PersonId == req.ApprovalOfficialId)
.Select(p => p.CompleteName)
.SingleOrDefaultAsync();

await Task.WhenAll(leaveHeaderTask, recommendedByNameTask, approvedByNameTask);

var leaveHeader = await leaveHeaderTask;
var RecommendedByName = await recommendedByNameTask;
var ApprovedByName = await approvedByNameTask;

string dateFiled = Convert.ToDateTime(req.DateFiled).ToShortDateString();
string startDate = Convert.ToDateTime(req.StartDate).ToShortDateString();
string endDate = Convert.ToDateTime(req.EndDate).ToShortDateString();
string leaveDuration;

if (startDate == "" && endDate == "")
{
leaveDuration = "N/A";
}
else if (startDate == "1/1/1900" &&  endDate == "1/1/1900")
{
leaveDuration = "";
}
else
{
leaveDuration = (startDate + " - " + endDate);
}

string leaveType = req.LeaveType.LeaveTypeDesc ?? "No Data";
decimal numberOfDays = Convert.ToDecimal(req.TotalDays);
decimal slCredits = (req.SLCredits.ToString() != "") ? Convert.ToDecimal(req.SLCredits) : 0;
decimal vlCredits = (req.VLCredits.ToString() != "") ? Convert.ToDecimal(req.VLCredits) : 0;

var reason = req.Reason ?? "No Data";

string approvedBy = "";
if (leaveHeader.IsApproved == true)
{
approvedBy = ApprovedByName ?? "No Data";
}
else if (leaveHeader.IsApproved == false && leaveHeader.IsDisapproved == true)
{
approvedBy = ApprovedByName ?? "No Data";
}
string recommendedBy = "";
if (leaveHeader.IsRecommended == true || leaveHeader.IsDisapproved == true)
{
recommendedBy = RecommendedByName ?? "No Data";
}
int leaveHeaderId = req.LeaveHeaderId;
int? empId = req.EmployeeId;

string docsSubmitted = (from doc in context.LeaveDocSubmitteds where doc.DocSubmittedId == req.DocSubmittedId select doc.DocSubmittedDesc).SingleOrDefault() ?? "No Data";

string remarks = checkApprovedLeaveDetails(req.LeaveHeaderId) ?? "No Data";

rowsObj[i] = new
{
id = leaveHeaderId,
cell = new object[] {
leaveHeaderId,
empId,
dateFiled,
leaveDuration,
leaveType,
numberOfDays,
reason,
docsSubmitted,
recommendedBy,
approvedBy,
remarks ,
}
};

}

}
return rowsObj;
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.InnerException);
System.Diagnostics.Debug.WriteLine("Loop tasks failed");
throw;
}
finally
{
semaphore.Release();
}
}
Идея заключалась в том, чтобы использовать async в методе, который имеет цикл foreach и возвращает массив объектов.
Когда await Task.WhenAll(listOfTasks), действие не возвращает никаких данных результата JSON, оно возвращает System.Task, даже в ответ на браузер (firebug).

Подробнее здесь: https://stackoverflow.com/questions/793 ... sk-whenall
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»