执行思路: 启动一个新线程,在新线程中执行长时间任务,保存子线程执行进度,用ajax获取执行进度,反馈给用户。
1. 使用Session保存子线程执行进度。
注意:1.使用Session保存执行状态时,需要先在主线程中设置Session的值,否则会报错(错误提示 要启用页面SessionState)。
2. Session必须配置保存在进程中,如果保存在StateServer或SqlServer,将会得不到结果。
2. 使用Cache保存 子线程执行进度。
使用Cache保存执行状态,可解决使用Session会碰到的两个问题,
但使用Cache,就只能一个人进行操作,否则,多人操作会只获得最后一个操作用户的执行状态。
以下是部分示例代码:
// 主线程
Thread handleThread = new Thread(new ParameterizedThreadStart(this.UpdateData));
handleThread.Start(saveFile);
/// <summary>
/// 处理数据
/// </summary>
/// <param name="fileSrc">上传的excel文件</param>
private void UpdateData(object fileSrc)
{
if (fileSrc == null)
{
return;
}
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "1", null, DateTime.Now.AddMinutes(30)); // 处理中
try
{
if (!this.HandData(fileSrc.ToString()))
{
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "0", null, DateTime.Now.AddMinutes(30)); // 处理出错
return;
}
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "2", null, DateTime.Now.AddMinutes(30)); // 处理完成
}
catch
{
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "0", null, DateTime.Now.AddMinutes(30)); // 处理出错
}
}
handleThread.Start(saveFile);
/// <summary>
/// 处理数据
/// </summary>
/// <param name="fileSrc">上传的excel文件</param>
private void UpdateData(object fileSrc)
{
if (fileSrc == null)
{
return;
}
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "1", null, DateTime.Now.AddMinutes(30)); // 处理中
try
{
if (!this.HandData(fileSrc.ToString()))
{
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "0", null, DateTime.Now.AddMinutes(30)); // 处理出错
return;
}
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "2", null, DateTime.Now.AddMinutes(30)); // 处理完成
}
catch
{
Caching.Set(ProductCacheKey.TB_DATA_UPDATE_STATUS, "0", null, DateTime.Now.AddMinutes(30)); // 处理出错
}
}