asp.net-mvc - 在后台运行函数并保持运行默认程序流程
问题描述
我有基本的 excel 文件生成器功能需要 2 个日期参数
public void ExportToExcel(DateTime? start, DateTime? end)
但是这个功能需要很长时间,我不想等待这个准备时间。我希望这个函数在后台运行而不是冻结我的 actionResult
public ActionResult Listele(DateTime? dates, DateTime? datee,string submit)
{
var model = db.Transections.ToList();
DateTime startdate = dates ?? new DateTime(2000, 10, 10, 1, 1, 1, 1);
DateTime enddate = datee ?? DateTime.Now; ;
foreach (var item in model.ToList())
{
if (item.Date < startdate || item.Date > enddate)
{
model.Remove(item);
}
}
Debug.WriteLine(model.Count());
if(submit == "report")
{
return RedirectToAction("ExportToExcel", "Grid", new { @start = dates, @end = datee });
}
return View(model);
}
此操作结果必须正在运行,而不是通过等待此功能和我的前端执行此操作而冻结
@model IEnumerable<codefirst.Models.Transection>
@using GridMvc.Html
@{
ViewBag.Title = "Listele";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Listele</h2>
<form action="/Grid/Listele" method="get">
<div class="form-group>
<label for="q">Start Date</label>
<input type="date" name="dates" id="dates" class="form-control" />
<label for="q">End Date</label>
<input type="date" name="datee" id="datee" class="form-control" />
</div>
<input class="btn btn-primary" type="submit" value="cek" name="submit" />
<input class="btn btn-primary" type="submit" value="report" name="submit" />
@* @Html.ActionLink("Report", "ExportToExcel", "Grid")*@
</form>
@Html.Grid(Model).Columns(Column =>
{
Column.Add(m => m.Buyer).Titled("Buyer").Sortable(true).Filterable(true);
Column.Add(m => m.Seller).Titled("Seller").Sortable(true).Filterable(true);
Column.Add(m => m.Amount).Titled("Amount").Sortable(true).Filterable(true);
Column.Add(m => m.Date).Titled("Date").Sortable(true).Filterable(true).Format("{0:d}");
Column.Add().Format("{0:MM/dd/yyyy}")
.Encoded(false)
.Sanitized(false)
.SetWidth(30)
.RenderValueAs(o => Html.ActionLink("Düzenle", "Duzenle", "Grid", new { id = o.id }, new { @class = "btn btn-warning" }));
}).WithPaging(50)
我尝试像这样异步运行导出excel方法单独运行但我无法触发此功能异步
public void ExportToExcelasync(DateTime? start, DateTime? end)
{
Debug.WriteLine("async geldi");
Debug.WriteLine(start);
Debug.WriteLine(end);
System.Threading.Tasks.Task.Run(() => ExportToExcel(start,end));
}
public void ExportToExcel(DateTime? start, DateTime? end)
它是我的 exportexcel 函数
public void ExportToExcel(DateTime? start, DateTime? end)
{
Debug.WriteLine("Export To Excel çaılıştı");
Debug.WriteLine(start);
Debug.WriteLine(end);
/*
for (int i = 0; i < 10000; i++)
{
Debug.Write(i);
}
*/
try
{//Downloads tablosuna indirmenin kaydı
Download m = new Download();
DateTime startdate = start ?? new DateTime(2000, 10, 10, 1, 1, 1, 1); ;
DateTime enddate = end ?? DateTime.Now;
Debug.WriteLine(startdate);
Debug.WriteLine(enddate);
//each caseler eklenecek seçmezse geçersiz seçerse end date start date den buyukse startla end date degıstırme eklencek
DateTime now = DateTime.Now;
//string trim = text.Replace( " ", "_" );
m.IsExist = false;
m.CreateDate = now;
m.EndDate = now;
m.StartDate = now;
string name = "Report";
string date = now.ToString("F");
date = date.Replace(" ", "_");
date = date.Replace(",", "_");
string sonu = ".xls";
date += sonu;
name += date;
m.GuidName = name;
db.Downloads.Add(m);
db.SaveChanges();
//Excelin hazırlanması
var gv = new GridView();
var temp = db.Transections.ToList();
// start 2010 ///// end 2015
foreach (var item in temp.ToList())
{
if (item.Date < startdate || item.Date > enddate)
{
temp.Remove(item);
}
}
gv.DataSource = temp;
gv.DataBind();
Response.ClearContent();
Response.Buffer = true;
string attachment = "attachment; filename=";
attachment = attachment + name;
//attachment = "\"" + attachment +"\"";
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
Response.Charset = "";
StringWriter objStringWriter = new StringWriter();
HtmlTextWriter objHtmlTextWriter = new HtmlTextWriter(objStringWriter);
gv.RenderControl(objHtmlTextWriter);
Response.Output.Write(objStringWriter.ToString());
Response.Flush();
Response.End();
/*
Download download = new Download();
download = db.Downloads.Find(m.GuidName);
download.IsExist = true;
db.Entry(download).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
*/
//Debug.WriteLine(download.IsExist);
{ /*
public ActionResult UpdateCustomer(Customer customer)
{
using (CustomersEntities entities = new CustomersEntities())
{
Customer updatedCustomer = (from c in entities.Customers
where c.CustomerId == customer.CustomerId
select c).FirstOrDefault();
updatedCustomer.Name = customer.Name;
updatedCustomer.Country = customer.Country;
entities.SaveChanges();
}
*/
}
Debug.WriteLine("Return geldi");
//return NonActionAttribute();
}
catch (Exception ex)
{
Debug.WriteLine(ex);
//exception loglanacak
//return View("Index");
}
}
Response.AddHeader("内容配置", 附件); 这一行做一个例外,例外是
Exception thrown: 'System.ArgumentException' in System.Web.dll
System.ArgumentException: Value does not fall within the expected range.
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Web.Hosting.IIS7WorkerRequest.SetUnknownResponseHeader(String name, String value, Boolean replace)
at System.Web.HttpHeaderCollection.SetHeader(String name, String value, Boolean replace)
at System.Web.HttpHeaderCollection.Add(String name, String value)
at System.Web.HttpResponse.AppendHeader(String name, String value)
at System.Web.HttpResponseWrapper.AddHeader(String name, String value)
at codefirst.Controllers.GridController.ExportToExcel(Nullable`1 start, Nullable`1 end) in C:\Users\nto_9\source\repos\codefirst\codefirst\Controllers\GridController.cs:line 176
这个异常的原因是什么,我无法理解,我怎么能修复它,你能看到我吗?我想念你的帮助
我正在尝试异步等待
我像这样更改我的异步方法并将导出更改为像这样的 excel 方法,但它不起作用这仍然是等待我的 actionresult 以完成 exporttoexcel 方法你能看到我的错误吗?
我的异步调用函数
public async Task ExportToExcelasync(DateTime? start, DateTime? end)
{
Debug.WriteLine("async geldi");
Debug.WriteLine(start);
Debug.WriteLine(end);
await Task.Run(() => ExportToExcel(start, end));
}
我导出到 excel 函数
public void ExportToExcel(DateTime? start, DateTime? end)
{
Debug.WriteLine("Export To Excel çaılıştı");
Debug.WriteLine(start);
Debug.WriteLine(end);
for (int i = 0; i < 10000; i++)
{
Debug.Write(i);
}
try
{//Downloads tablosuna indirmenin kaydı
Download m = new Download();
DateTime startdate = start ?? new DateTime(2000, 10, 10, 1, 1, 1, 1); ;
DateTime enddate = end ?? DateTime.Now;
Debug.WriteLine(startdate);
Debug.WriteLine(enddate);
//each caseler eklenecek seçmezse geçersiz seçerse end date start date den buyukse startla end date degıstırme eklencek
DateTime now = DateTime.Now;
//string trim = text.Replace( " ", "_" );
m.IsExist = false;
m.CreateDate = now;
m.EndDate = now;
m.StartDate = now;
string name = "Report";
string date = now.ToString("F");
date = date.Replace(" ", "_");
date = date.Replace(",", "_");
string sonu = ".xls";
date += sonu;
name += date;
m.GuidName = name;
db.Downloads.Add(m);
db.SaveChanges();
//Excelin hazırlanması
var gv = new GridView();
var temp = db.Transections.ToList();
// start 2010 ///// end 2015
foreach (var item in temp.ToList())
{
if (item.Date < startdate || item.Date > enddate)
{
temp.Remove(item);
}
}
gv.DataSource = temp;
gv.DataBind();
Response.ClearContent();
Response.Buffer = true;
string attachment = "attachment; filename=";
attachment = attachment + name;
//attachment = "\"" + attachment +"\"";
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
Response.Charset = "";
StringWriter objStringWriter = new StringWriter();
HtmlTextWriter objHtmlTextWriter = new HtmlTextWriter(objStringWriter);
gv.RenderControl(objHtmlTextWriter);
Response.Output.Write(objStringWriter.ToString());
Response.Flush();
Response.End();
}
catch (Exception ex)
{
}
}
解决方案
推荐阅读
- typescript - 输入'HTMLCollectionOf
' 必须有一个返回迭代器的 '[Symbol.iterator]()' 方法 - spring - 从所有其他微服务获取当前经过身份验证的用户
- sql - 查询中的多个 Drop table 语句失败
- google-apps-script - 活动工作表中的 getUi
- android - 如何在 Android 的 AsyncHttpClient 连接中间停止已建立的连接?
- regex - groovy 正则表达式难度
- java - 不同参数Java的抽象方法
- mysql - 从下拉列表中选择后,我应该如何维护状态会话?
- r - R - 向量内存耗尽(达到限制?)嵌套循环的内存问题?
- r - 如何在 r-markdown 中为非 LaTeX 输出格式创建缩写列表?