【发布时间】:2016-10-17 19:42:07
【问题描述】:
我有下面的代码,它在方法没有参数时有效,但在我传入参数时无效。我最初认为,当 IIS 中的上下文丢失时,参数也会丢失,所以我做了一个深拷贝,同样的事情仍然发生。我也尝试记录错误或消息,但同样的事情 - 它从不调用方法来完成任务。初始日志消息写入成功,但不是我想添加的方法中的日志消息发生在 asp mvc 项目中。我已经在这个问题上待了 2 天,在 stackoverflow 和谷歌上都没有解决方案。我添加了线程睡眠以使后台线程可能启动,但它不起作用。 currentcontroller 继承自 basecontroller 类。记录器使用 log4net。日志记录有效,我看到数据库中的条目。添加了 thread.sleep 以查看它是否通过使父线程等待后台线程启动来解决问题。有什么想法吗?
public class MainController : BaseController
{
[HttpPost]
public JsonResult ProcessSynchronization(int sourceId, string[] cities)
{
var ret = false;
try
{
if (sourceId == 1)
{
var cityDeep = (string[])cities.Clone();
Logger.Info("ABout to start BeginSynchronization ..");
Task.Factory.StartNew(() =>
{
Logger.Info("ABout to start BeginSynchronization enter..");
BeginSynchronization(cityDeep);
});
Thread.Sleep(5000);
ret = true;
}
}
catch (Exception ex)
{
Logger.Error(LogUtility.BuildExceptionMessage(ex), ex);
return Json(new { result = ret, responseText = "Customer could not be activated." });
}
return Json(new { result = ret, responseText = "Synchronization started." });
}
private void BeginSynchronization (string[] cities)
{
Logger.Info("BeginSynchronization entry processing..");
}
}
public class BaseController : Controller
{
/// <summary>
/// Get logger
/// </summary>
protected ILog Logger
{
get { return LogManager.GetLogger(GetType()); }
}
}
【问题讨论】:
-
Thread.Sleep的目的是什么?Logger是如何声明的?为什么要在另一个线程(使用Task.Factory.StartNew创建)中调用实例方法?目前尚不清楚您要达到的目标。另外,请添加整个控制器代码并仔细检查是否引发任何异常。 -
我添加了更多细节。调用实例方法是什么意思?这是同一控制器类中的私有方法。
标签: c# asp.net-mvc multithreading iis-7